﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Stefanie-随笔分类-Java</title><link>http://www.blogjava.net/heiyuchuanxia/category/16888.html</link><description>On The Road of Web Services</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 15:39:13 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 15:39:13 GMT</pubDate><ttl>60</ttl><item><title>字符串验证--java.util.regex.Pattern</title><link>http://www.blogjava.net/heiyuchuanxia/archive/2006/11/18/81974.html</link><dc:creator>Stefanie</dc:creator><author>Stefanie</author><pubDate>Sat, 18 Nov 2006 14:38:00 GMT</pubDate><guid>http://www.blogjava.net/heiyuchuanxia/archive/2006/11/18/81974.html</guid><wfw:comment>http://www.blogjava.net/heiyuchuanxia/comments/81974.html</wfw:comment><comments>http://www.blogjava.net/heiyuchuanxia/archive/2006/11/18/81974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/heiyuchuanxia/comments/commentRss/81974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/heiyuchuanxia/services/trackbacks/81974.html</trackback:ping><description><![CDATA[      今天修改了jsf的验证器部分...看到了对于email的验证.....看起来还是有点头大呀.....于是乎翻javadoc....找到了<strong>java.util.regex.Pattern</strong>类....挺有意思的...一起分享一下...... 
<h2><font size="-1">java.util.regex</font><br />类 Pattern</h2><pre><a title="java.lang 中的类" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/Object.html">java.lang.Object</a><b>java.util.regex.Pattern</b></pre><dl><dt><b>所有已实现的接口：</b></dt><dd><a title="java.io 中的接口" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/io/Serializable.html">Serializable</a></dd></dl><hr /><dl><dt></dt><pre>public final class <b>Pattern</b><dt>extends <a title="java.lang 中的类" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/Object.html">Object</a></dt><dt>implements <a title="java.io 中的接口" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/io/Serializable.html">Serializable</a></dt></pre></dl><pre></pre><p>正则表达式的编译表示形式。 </p><p>指定为字符串的正则表达式必须首先被编译为此类的实例。然后，可将得到的模式用于创建 <a title="java.util.regex 中的类" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Matcher.html"><code><font face="新宋体">Matcher</font></code></a> 对象，依照正则表达式，该对象可以与任意<a title="java.lang 中的接口" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/CharSequence.html"><code></code>字符序列<code></code></a>匹配。执行匹配所涉及的所有状态都驻留在匹配器中，所以多个匹配器可以共享同一模式。 </p><p>因此，典型的调用顺序是 </p><blockquote><pre> Pattern p = Pattern.<a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#compile(java.lang.String)"><code>compile</code></a>("a*b");
 Matcher m = p.<a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#matcher(java.lang.CharSequence)"><code>matcher</code></a>("aaaaab");
 boolean b = m.<a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Matcher.html#matches()"><code>matches</code></a>();</pre></blockquote><p>在仅使用一次正则表达式时，可以方便地通过此类定义 <a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#matches(java.lang.String, java.lang.CharSequence)"><code><font face="新宋体">matches</font></code></a> 方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句 </p><blockquote><pre> boolean b = Pattern.matches("a*b", "aaaaab");</pre></blockquote>等效于上面的三个语句，尽管对于重复的匹配而言它效率不高，因为它不允许重用已编译的模式。 
<p>此类的实例是不可变的，可供多个并发线程安全使用。<a title="java.util.regex 中的类" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Matcher.html"><code><font face="新宋体">Matcher</font></code></a> 类的实例用于此目的则不安全。 <a name="sum"><h4>正则表达式的构造摘要 </h4><table cellspacing="0" cellpadding="1" summary="Regular expression constructs, and what they match" border="0"><tbody><tr align="left"><th id="construct" align="left" bgcolor="#ccccff">构造</th><th id="matches" align="left" bgcolor="#ccccff">匹配</th></tr><tr><th> </th></tr><tr align="left"><th id="characters" colspan="2">字符</th></tr><tr><td valign="top" headers="construct characters"><i>x</i></td><td headers="matches">字符 <i>x</i></td></tr><tr><td valign="top" headers="construct characters"><tt><font face="新宋体">\\</font></tt></td><td headers="matches">反斜线字符</td></tr><tr><td valign="top" headers="construct characters"><tt><font face="新宋体">\0</font></tt><i>n</i></td><td headers="matches">带有八进制值 <tt><font face="新宋体">0</font></tt> 的字符 <i>n</i> (0 <tt><font face="新宋体">&lt;=</font></tt> <i>n</i> <tt><font face="新宋体">&lt;=</font></tt> 7)</td></tr><tr><td valign="top" headers="construct characters"><tt><font face="新宋体">\0</font></tt><i>nn</i></td><td headers="matches">带有八进制值 <tt><font face="新宋体">0</font></tt> 的字符 <i>nn</i> (0 <tt><font face="新宋体">&lt;=</font></tt> <i>n</i> <tt><font face="新宋体">&lt;=</font></tt> 7)</td></tr><tr><td valign="top" headers="construct characters"><tt><font face="新宋体">\0</font></tt><i>mnn</i></td><td headers="matches">带有八进制值 <tt><font face="新宋体">0</font></tt> 的字符 <i>mnn</i>（0 <tt><font face="新宋体">&lt;=</font></tt> <i>m</i> <tt><font face="新宋体">&lt;=</font></tt> 3、0 <tt><font face="新宋体">&lt;=</font></tt> <i>n</i> <tt><font face="新宋体">&lt;=</font></tt> 7）</td></tr><tr><td valign="top" headers="construct characters"><tt><font face="新宋体">\x</font></tt><i>hh</i></td><td headers="matches">带有十六进制值 <tt><font face="新宋体">0x</font></tt> 的字符 <i>hh</i></td></tr><tr><td valign="top" headers="construct characters"><tt><font face="新宋体">\u</font></tt><i>hhhh</i></td><td headers="matches">带有十六进制值 <tt><font face="新宋体">0x</font></tt> 的字符 <i>hhhh</i></td></tr><tr><td valign="top" headers="matches"><tt><font face="新宋体">\t</font></tt></td><td headers="matches">制表符 (<tt><font face="新宋体">'\u0009'</font></tt>)</td></tr><tr><td valign="top" headers="construct characters"><tt><font face="新宋体">\n</font></tt></td><td headers="matches">新行（换行）符 (<tt><font face="新宋体">'\u000A'</font></tt>)</td></tr><tr><td valign="top" headers="construct characters"><tt><font face="新宋体">\r</font></tt></td><td headers="matches">回车符 (<tt><font face="新宋体">'\u000D'</font></tt>)</td></tr><tr><td valign="top" headers="construct characters"><tt><font face="新宋体">\f</font></tt></td><td headers="matches">换页符 (<tt><font face="新宋体">'\u000C'</font></tt>)</td></tr><tr><td valign="top" headers="construct characters"><tt><font face="新宋体">\a</font></tt></td><td headers="matches">报警 (bell) 符 (<tt><font face="新宋体">'\u0007'</font></tt>)</td></tr><tr><td valign="top" headers="construct characters"><tt><font face="新宋体">\e</font></tt></td><td headers="matches">转义符 (<tt><font face="新宋体">'\u001B'</font></tt>)</td></tr><tr><td valign="top" headers="construct characters"><tt><font face="新宋体">\c</font></tt><i>x</i></td><td headers="matches">对应于 <i>x</i> 的控制符</td></tr><tr><th> </th></tr><tr align="left"><th id="classes" colspan="2">字符类</th></tr><tr><td valign="top" headers="construct classes"><tt><font face="新宋体">[abc]</font></tt></td><td headers="matches"><tt><font face="新宋体">a</font></tt>、<tt><font face="新宋体">b</font></tt> 或 <tt><font face="新宋体">c</font></tt>（简单类）</td></tr><tr><td valign="top" headers="construct classes"><tt><font face="新宋体">[^abc]</font></tt></td><td headers="matches">任何字符，除了 <tt><font face="新宋体">a</font></tt>、<tt><font face="新宋体">b</font></tt> 或 <tt><font face="新宋体">c</font></tt>（否定）</td></tr><tr><td valign="top" headers="construct classes"><tt><font face="新宋体">[a-zA-Z]</font></tt></td><td headers="matches"><tt><font face="新宋体">a</font></tt> 到 <tt><font face="新宋体">z</font></tt> 或 <tt><font face="新宋体">A</font></tt> 到 <tt><font face="新宋体">Z</font></tt>，两头的字母包括在内（范围）</td></tr><tr><td valign="top" headers="construct classes"><tt><font face="新宋体">[a-d[m-p]]</font></tt></td><td headers="matches"><tt><font face="新宋体">a</font></tt> 到 <tt><font face="新宋体">d</font></tt> 或 <tt><font face="新宋体">m</font></tt> 到 <tt><font face="新宋体">p</font></tt>：<tt><font face="新宋体">[a-dm-p]</font></tt>（并集）</td></tr><tr><td valign="top" headers="construct classes"><tt><font face="新宋体">[a-z&amp;&amp;[def]]</font></tt></td><td headers="matches"><tt><font face="新宋体">d</font></tt>、<tt><font face="新宋体">e</font></tt> 或 <tt><font face="新宋体">f</font></tt>（交集）</td></tr><tr><td valign="top" headers="construct classes"><tt><font face="新宋体">[a-z&amp;&amp;[^bc]]</font></tt></td><td headers="matches"><tt><font face="新宋体">a</font></tt> 到 <tt><font face="新宋体">z</font></tt>，除了 <tt><font face="新宋体">b</font></tt> 和 <tt><font face="新宋体">c</font></tt>：<tt><font face="新宋体">[ad-z]</font></tt>（减去）</td></tr><tr><td valign="top" headers="construct classes"><tt><font face="新宋体">[a-z&amp;&amp;[^m-p]]</font></tt></td><td headers="matches"><tt><font face="新宋体">a</font></tt> 到 <tt><font face="新宋体">z</font></tt>，而非 <tt><font face="新宋体">m</font></tt> 到 <tt><font face="新宋体">p</font></tt>：<tt><font face="新宋体">[a-lq-z]</font></tt>（减去）</td></tr><tr><th> </th></tr><tr align="left"><th id="predef" colspan="2">预定义字符类</th></tr><tr><td valign="top" headers="construct predef"><tt><font face="新宋体">.</font></tt></td><td headers="matches">任何字符（与<a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#lt">行结束符</a>可能匹配也可能不匹配）</td></tr><tr><td valign="top" headers="construct predef"><tt><font face="新宋体">\d</font></tt></td><td headers="matches">数字：<tt><font face="新宋体">[0-9]</font></tt></td></tr><tr><td valign="top" headers="construct predef"><tt><font face="新宋体">\D</font></tt></td><td headers="matches">非数字： <tt><font face="新宋体">[^0-9]</font></tt></td></tr><tr><td valign="top" headers="construct predef"><tt><font face="新宋体">\s</font></tt></td><td headers="matches">空白字符：<tt><font face="新宋体">[ \t\n\x0B\f\r]</font></tt></td></tr><tr><td valign="top" headers="construct predef"><tt><font face="新宋体">\S</font></tt></td><td headers="matches">非空白字符：<tt><font face="新宋体">[^\s]</font></tt></td></tr><tr><td valign="top" headers="construct predef"><tt><font face="新宋体">\w</font></tt></td><td headers="matches">单词字符：<tt><font face="新宋体">[a-zA-Z_0-9]</font></tt></td></tr><tr><td valign="top" headers="construct predef"><tt><font face="新宋体">\W</font></tt></td><td headers="matches">非单词字符：<tt><font face="新宋体">[^\w]</font></tt></td></tr><tr><th> </th></tr><tr align="left"><th id="posix" colspan="2">POSIX 字符类（仅 US-ASCII）<b></b></th></tr><tr><td valign="top" headers="construct posix"><tt><font face="新宋体">\p{Lower}</font></tt></td><td headers="matches">小写字母字符：<tt><font face="新宋体">[a-z]</font></tt></td></tr><tr><td valign="top" headers="construct posix"><tt><font face="新宋体">\p{Upper}</font></tt></td><td headers="matches">大写字母字符：<tt><font face="新宋体">[A-Z]</font></tt></td></tr><tr><td valign="top" headers="construct posix"><tt><font face="新宋体">\p{ASCII}</font></tt></td><td headers="matches">所有 ASCII：<tt><font face="新宋体">[\x00-\x7F]</font></tt></td></tr><tr><td valign="top" headers="construct posix"><tt><font face="新宋体">\p{Alpha}</font></tt></td><td headers="matches">字母字符：<tt><font face="新宋体">[\p{Lower}\p{Upper}]</font></tt></td></tr><tr><td valign="top" headers="construct posix"><tt><font face="新宋体">\p{Digit}</font></tt></td><td headers="matches">十进制数字：<tt><font face="新宋体">[0-9]</font></tt></td></tr><tr><td valign="top" headers="construct posix"><tt><font face="新宋体">\p{Alnum}</font></tt></td><td headers="matches">字母数字字符：<tt><font face="新宋体">[\p{Alpha}\p{Digit}]</font></tt></td></tr><tr><td valign="top" headers="construct posix"><tt><font face="新宋体">\p{Punct}</font></tt></td><td headers="matches">标点符号：<tt><font face="新宋体">!"#$%&amp;'()*+,-./:;&lt;=&gt;?@[\]^_`{|}~</font></tt></td></tr><!-- <tt>[\!"#\$%&'\(\)\*\+,\-\&#46;/:;\<=\>\?@\[\\\]\^_`\{\|\}~]</tt>
          <tt>[\X21-\X2F\X31-\X40\X5B-\X60\X7B-\X7E]</tt> --><tr><td valign="top" headers="construct posix"><tt><font face="新宋体">\p{Graph}</font></tt></td><td headers="matches">可见字符：<tt><font face="新宋体">[\p{Alnum}\p{Punct}]</font></tt></td></tr><tr><td valign="top" headers="construct posix"><tt><font face="新宋体">\p{Print}</font></tt></td><td headers="matches">可打印字符：<tt><font face="新宋体">[\p{Graph}\x20]</font></tt></td></tr><tr><td valign="top" headers="construct posix"><tt><font face="新宋体">\p{Blank}</font></tt></td><td headers="matches">空格或制表符：<tt><font face="新宋体">[ \t]</font></tt></td></tr><tr><td valign="top" headers="construct posix"><tt><font face="新宋体">\p{Cntrl}</font></tt></td><td headers="matches">控制字符：<tt><font face="新宋体">[\x00-\x1F\x7F]</font></tt></td></tr><tr><td valign="top" headers="construct posix"><tt><font face="新宋体">\p{XDigit}</font></tt></td><td headers="matches">十六进制数字：<tt><font face="新宋体">[0-9a-fA-F]</font></tt></td></tr><tr><td valign="top" headers="construct posix"><tt><font face="新宋体">\p{Space}</font></tt></td><td headers="matches">空白字符：<tt><font face="新宋体">[ \t\n\x0B\f\r]</font></tt></td></tr><tr><th> </th></tr><tr align="left"><th colspan="2">java.lang.Character 类（简单的 <a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#jcc">java 字符类型</a>）</th></tr><tr><td valign="top"><tt><font face="新宋体">\p{javaLowerCase}</font></tt></td><td>等效于 java.lang.Character.isLowerCase()</td></tr><tr><td valign="top"><tt><font face="新宋体">\p{javaUpperCase}</font></tt></td><td>等效于 java.lang.Character.isUpperCase()</td></tr><tr><td valign="top"><tt><font face="新宋体">\p{javaWhitespace}</font></tt></td><td>等效于 java.lang.Character.isWhitespace()</td></tr><tr><td valign="top"><tt><font face="新宋体">\p{javaMirrored}</font></tt></td><td>等效于 java.lang.Character.isMirrored()</td></tr><tr><th> </th></tr><tr align="left"><th id="unicode" colspan="2">Unicode 块和类别的类</th></tr><tr><td valign="top" headers="construct unicode"><tt><font face="新宋体">\p{InGreek}</font></tt></td><td headers="matches">Greek 块（简单<a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#ubc">块</a>）中的字符</td></tr><tr><td valign="top" headers="construct unicode"><tt><font face="新宋体">\p{Lu}</font></tt></td><td headers="matches">大写字母（简单<a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#ubc">类别</a>）</td></tr><tr><td valign="top" headers="construct unicode"><tt><font face="新宋体">\p{Sc}</font></tt></td><td headers="matches">货币符号</td></tr><tr><td valign="top" headers="construct unicode"><tt><font face="新宋体">\P{InGreek}</font></tt></td><td headers="matches">所有字符，Greek 块中的除外（否定）</td></tr><tr><td valign="top" headers="construct unicode"><tt><font face="新宋体">[\p{L}&amp;&amp;[^\p{Lu}]] </font></tt></td><td headers="matches">所有字母，大写字母除外（减去）</td></tr><tr><th> </th></tr><tr align="left"><th id="bounds" colspan="2">边界匹配器</th></tr><tr><td valign="top" headers="construct bounds"><tt><font face="新宋体">^</font></tt></td><td headers="matches">行的开头</td></tr><tr><td valign="top" headers="construct bounds"><tt><font face="新宋体">$</font></tt></td><td headers="matches">行的结尾</td></tr><tr><td valign="top" headers="construct bounds"><tt><font face="新宋体">\b</font></tt></td><td headers="matches">单词边界</td></tr><tr><td valign="top" headers="construct bounds"><tt><font face="新宋体">\B</font></tt></td><td headers="matches">非单词边界</td></tr><tr><td valign="top" headers="construct bounds"><tt><font face="新宋体">\A</font></tt></td><td headers="matches">输入的开头</td></tr><tr><td valign="top" headers="construct bounds"><tt><font face="新宋体">\G</font></tt></td><td headers="matches">上一个匹配的结尾</td></tr><tr><td valign="top" headers="construct bounds"><tt><font face="新宋体">\Z</font></tt></td><td headers="matches">输入的结尾，仅用于最后的<a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#lt">结束符</a>（如果有的话）</td></tr><tr><td valign="top" headers="construct bounds"><tt><font face="新宋体">\z</font></tt></td><td headers="matches">输入的结尾</td></tr><tr><th> </th></tr><tr align="left"><th id="greedy" colspan="2">Greedy 数量词</th></tr><tr><td valign="top" headers="construct greedy"><i>X</i><tt><font face="新宋体">?</font></tt></td><td headers="matches"><i>X</i>，一次或一次也没有</td></tr><tr><td valign="top" headers="construct greedy"><i>X</i><tt><font face="新宋体">*</font></tt></td><td headers="matches"><i>X</i>，零次或多次</td></tr><tr><td valign="top" headers="construct greedy"><i>X</i><tt><font face="新宋体">+</font></tt></td><td headers="matches"><i>X</i>，一次或多次</td></tr><tr><td valign="top" headers="construct greedy"><i>X</i><tt><font face="新宋体">{</font></tt><i>n</i><tt><font face="新宋体">}</font></tt></td><td headers="matches"><i>X</i>，恰好 <i>n</i> 次</td></tr><tr><td valign="top" headers="construct greedy"><i>X</i><tt><font face="新宋体">{</font></tt><i>n</i><tt><font face="新宋体">,}</font></tt></td><td headers="matches"><i>X</i>，至少 <i>n</i> 次</td></tr><tr><td valign="top" headers="construct greedy"><i>X</i><tt><font face="新宋体">{</font></tt><i>n</i><tt><font face="新宋体">,</font></tt><i>m</i><tt><font face="新宋体">}</font></tt></td><td headers="matches"><i>X</i>，至少 <i>n</i> 次，但是不超过 <i>m</i> 次</td></tr><tr><th> </th></tr><tr align="left"><th id="reluc" colspan="2">Reluctant 数量词</th></tr><tr><td valign="top" headers="construct reluc"><i>X</i><tt><font face="新宋体">??</font></tt></td><td headers="matches"><i>X</i>，一次或一次也没有</td></tr><tr><td valign="top" headers="construct reluc"><i>X</i><tt><font face="新宋体">*?</font></tt></td><td headers="matches"><i>X</i>，零次或多次</td></tr><tr><td valign="top" headers="construct reluc"><i>X</i><tt><font face="新宋体">+?</font></tt></td><td headers="matches"><i>X</i>，一次或多次</td></tr><tr><td valign="top" headers="construct reluc"><i>X</i><tt><font face="新宋体">{</font></tt><i>n</i><tt><font face="新宋体">}?</font></tt></td><td headers="matches"><i>X</i>，恰好 <i>n</i> 次</td></tr><tr><td valign="top" headers="construct reluc"><i>X</i><tt><font face="新宋体">{</font></tt><i>n</i><tt><font face="新宋体">,}?</font></tt></td><td headers="matches"><i>X</i>，至少 <i>n</i> 次</td></tr><tr><td valign="top" headers="construct reluc"><i>X</i><tt><font face="新宋体">{</font></tt><i>n</i><tt><font face="新宋体">,</font></tt><i>m</i><tt><font face="新宋体">}?</font></tt></td><td headers="matches"><i>X</i>，至少 <i>n</i> 次，但是不超过 <i>m</i> 次</td></tr><tr><th> </th></tr><tr align="left"><th id="poss" colspan="2">Possessive 数量词</th></tr><tr><td valign="top" headers="construct poss"><i>X</i><tt><font face="新宋体">?+</font></tt></td><td headers="matches"><i>X</i>，一次或一次也没有</td></tr><tr><td valign="top" headers="construct poss"><i>X</i><tt><font face="新宋体">*+</font></tt></td><td headers="matches"><i>X</i>，零次或多次</td></tr><tr><td valign="top" headers="construct poss"><i>X</i><tt><font face="新宋体">++</font></tt></td><td headers="matches"><i>X</i>，一次或多次</td></tr><tr><td valign="top" headers="construct poss"><i>X</i><tt><font face="新宋体">{</font></tt><i>n</i><tt><font face="新宋体">}+</font></tt></td><td headers="matches"><i>X</i>，恰好 <i>n</i> 次</td></tr><tr><td valign="top" headers="construct poss"><i>X</i><tt><font face="新宋体">{</font></tt><i>n</i><tt><font face="新宋体">,}+</font></tt></td><td headers="matches"><i>X</i>，至少 <i>n</i> 次</td></tr><tr><td valign="top" headers="construct poss"><i>X</i><tt><font face="新宋体">{</font></tt><i>n</i><tt><font face="新宋体">,</font></tt><i>m</i><tt><font face="新宋体">}+</font></tt></td><td headers="matches"><i>X</i>，至少 <i>n</i> 次，但是不超过 <i>m</i> 次</td></tr><tr><th> </th></tr><tr align="left"><th id="logical" colspan="2">Logical 运算符</th></tr><tr><td valign="top" headers="construct logical"><i>XY</i></td><td headers="matches"><i>X</i> 后跟 <i>Y</i></td></tr><tr><td valign="top" headers="construct logical"><i>X</i><tt><font face="新宋体">|</font></tt><i>Y</i></td><td headers="matches"><i>X</i> 或 <i>Y</i></td></tr><tr><td valign="top" headers="construct logical"><tt><font face="新宋体">(</font></tt><i>X</i><tt><font face="新宋体">)</font></tt></td><td headers="matches">X，作为<a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#cg">捕获组</a></td></tr><tr><th> </th></tr><tr align="left"><th id="backref" colspan="2">Back 引用</th></tr><tr><td valign="bottom" headers="construct backref"><tt><font face="新宋体">\</font></tt><i>n</i></td><td valign="bottom" headers="matches">任何匹配的 <i>n</i><sup>th</sup><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#cg">捕获组</a></td></tr><tr><th> </th></tr><tr align="left"><th id="quot" colspan="2">引用</th></tr><tr><td valign="top" headers="construct quot"><tt><font face="新宋体">\</font></tt></td><td headers="matches">Nothing，但是引用以下字符</td></tr><tr><td valign="top" headers="construct quot"><tt><font face="新宋体">\Q</font></tt></td><td headers="matches">Nothing，但是引用所有字符，直到 <tt><font face="新宋体">\E</font></tt></td></tr><tr><td valign="top" headers="construct quot"><tt><font face="新宋体">\E</font></tt></td><td headers="matches">Nothing，但是结束从 <tt><font face="新宋体">\Q</font></tt> 开始的引用</td></tr><!-- Metachars: !$()*+&#46;<>?[\]^{|} --><tr><th> </th></tr><tr align="left"><th id="special" colspan="2">特殊构造（非捕获）</th></tr><tr><td valign="top" headers="construct special"><tt><font face="新宋体">(?:</font></tt><i>X</i><tt><font face="新宋体">)</font></tt></td><td headers="matches"><i>X</i>，作为非捕获组</td></tr><tr><td valign="top" headers="construct special"><tt><font face="新宋体">(?idmsux-idmsux) </font></tt></td><td headers="matches">Nothing，但是将匹配标志由 on 转为 off</td></tr><tr><td valign="top" headers="construct special"><tt><font face="新宋体">(?idmsux-idmsux:</font></tt><i>X</i><tt><font face="新宋体">)</font></tt>  </td><td headers="matches"><i>X</i>，作为带有给定标志 on - off 的<a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#cg">非捕获组</a></td></tr><tr><td valign="top" headers="construct special"><tt><font face="新宋体">(?=</font></tt><i>X</i><tt><font face="新宋体">)</font></tt></td><td headers="matches"><i>X</i>，通过零宽度的正 lookahead</td></tr><tr><td valign="top" headers="construct special"><tt><font face="新宋体">(?!</font></tt><i>X</i><tt><font face="新宋体">)</font></tt></td><td headers="matches"><i>X</i>，通过零宽度的负 lookahead</td></tr><tr><td valign="top" headers="construct special"><tt><font face="新宋体">(?&lt;=</font></tt><i>X</i><tt><font face="新宋体">)</font></tt></td><td headers="matches"><i>X</i>，通过零宽度的正 lookbehind</td></tr><tr><td valign="top" headers="construct special"><tt><font face="新宋体">(?&lt;!</font></tt><i>X</i><tt><font face="新宋体">)</font></tt></td><td headers="matches"><i>X</i>，通过零宽度的负 lookbehind</td></tr><tr><td valign="top" headers="construct special"><tt><font face="新宋体">(?&gt;</font></tt><i>X</i><tt><font face="新宋体">)</font></tt></td><td headers="matches"><i>X</i>，作为独立的非捕获组</td></tr></tbody></table><hr /><a name="bs"><h4>反斜线、转义和引用 </h4><p>反斜线字符 (<tt><font face="新宋体">'\'</font></tt>) 用于引用转义构造，如上表所定义的，同时还用于引用其他将被解释为非转义构造的字符。因此，表达式 <tt><font face="新宋体">\\</font></tt> 与单个反斜线匹配，而 <tt><font face="新宋体">\{</font></tt> 与左括号匹配。 </p><p>在不表示转义构造的任何字母字符前使用反斜线都是错误的；它们是为将来扩展正则表达式语言保留的。可以在非字母字符前使用反斜线，不管该字符是否非转义构造的一部分。 </p><p>根据 <a href="http://java.sun.com/docs/books/jls/second_edition/html/">Java Language Specification</a> 的要求，Java 源代码的字符串中的反斜线被解释为 <a href="http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html#100850">Unicode 转义</a>或其他<a href="http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html#101089">字符转义</a>。因此必须在字符串字面值中使用两个反斜线，表示正则表达式受到保护，不被 Java 字节码编译器解释。例如，当解释为正则表达式时，字符串字面值 <tt><font face="新宋体">"\b"</font></tt> 与单个退格字符匹配，而 <tt><font face="新宋体">"\\b"</font></tt> 与单词边界匹配。字符串字面值 <tt><font face="新宋体">"\(hello\)"</font></tt> 是非法的，将导致编译时错误；要与字符串 <tt><font face="新宋体">(hello)</font></tt> 匹配，必须使用字符串字面值 <tt><font face="新宋体">"\\(hello\\)"</font></tt>。 <a name="cc"><h4>字符类 </h4><p>字符类可以出现在其他字符类中，并且可以包含并集运算符（隐式）和交集运算符 (<tt><font face="新宋体">&amp;&amp;</font></tt>)。并集运算符表示至少包含其某个操作数类中所有字符的类。交集运算符表示包含同时位于其两个操作数类中所有字符的类。 </p><p>字符类运算符的优先级如下所示，按从最高到最低的顺序排列： </p><blockquote><table cellspacing="0" cellpadding="1" summary="Precedence of character class operators." border="0"><tbody><tr><th>1    </th><td>字面值转义    </td><td><tt><font face="新宋体">\x</font></tt></td></tr><tr><th>2    </th><td>分组</td><td><tt><font face="新宋体">[...]</font></tt></td></tr><tr><th>3    </th><td>范围</td><td><tt><font face="新宋体">a-z</font></tt></td></tr><tr><th>4    </th><td>并集</td><td><tt><font face="新宋体">[a-e][i-u]<tt></tt></font></tt></td></tr><tr><th>5    </th><td>交集</td><td><tt><font face="新宋体">[a-z&amp;&amp;[aeiou]]</font></tt></td></tr></tbody></table></blockquote><p>注意，元字符的不同集合实际上位于字符类的内部，而非字符类的外部。例如，正则表达式 <tt><font face="新宋体">.</font></tt> 在字符类内部就失去了其特殊意义，而表达式 <tt><font face="新宋体">-</font></tt> 变成了形成元字符的范围。 <a name="lt"><h4>行结束符 </h4><p><i>行结束符</i> 是一个或两个字符的序列，标记输入字符序列的行结尾。以下代码被识别为行结束符： </p><ul><li>新行（换行）符 (<tt><font face="新宋体">'\n'</font></tt>)、 
</li><li>后面紧跟新行符的回车符 (<tt><font face="新宋体">"\r\n"</font></tt>)、 
</li><li>单独的回车符 (<tt><font face="新宋体">'\r'</font></tt>)、 
</li><li>下一行字符 (<tt><font face="新宋体">'\u0085'</font></tt>)、 
</li><li>行分隔符 (<tt><font face="新宋体">'\u2028'</font></tt>) 或 
</li><li>段落分隔符 (<tt><font face="新宋体">'\u2029</font></tt>)。 </li></ul><p>如果激活 <a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#UNIX_LINES"><code><font face="新宋体">UNIX_LINES</font></code></a> 模式，则新行符是惟一识别的行结束符。 </p><p>如果未指定 <a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#DOTALL"><code><font face="新宋体">DOTALL</font></code></a> 标志，则正则表达式 <tt><font face="新宋体">.</font></tt> 可以与任何字符（行结束符除外）匹配。 </p><p>默认情况下，正则表达式 <tt><font face="新宋体">^</font></tt> 和 <tt><font face="新宋体">$</font></tt> 忽略行结束符，仅分别与整个输入序列的开头和结尾匹配。如果激活 <a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#MULTILINE"><code><font face="新宋体">MULTILINE</font></code></a> 模式，则 <tt><font face="新宋体">^</font></tt> 在输入的开头和行结束符之后（输入的结尾）才发生匹配。处于 <a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#MULTILINE"><code><font face="新宋体">MULTILINE</font></code></a> 模式中时，<tt><font face="新宋体">$</font></tt> 仅在行结束符之前或输入序列的结尾处匹配。 <a name="cg"><h4>组和捕获 </h4><p>捕获组可以通过从左到右计算其开括号来编号。例如，在表达式 <tt><font face="新宋体">((A)(B(C)))</font></tt> 中，存在四个这样的组： </p><blockquote><table cellspacing="0" cellpadding="1" summary="Capturing group numberings"><tbody><tr><th>1    </th><td><tt><font face="新宋体">((A)(B(C)))</font></tt></td></tr><tr><th>2    </th><td><tt><font face="新宋体">\A</font></tt></td></tr><tr><th>3    </th><td><tt><font face="新宋体">(B(C))</font></tt></td></tr><tr><th>4    </th><td><tt><font face="新宋体">(C)</font></tt></td></tr></tbody></table></blockquote><p>组零始终代表整个表达式。 </p><p>之所以这样命名捕获组是因为在匹配中，保存了与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过 Back 引用在表达式中使用，也可以在匹配操作完成后从匹配器检索。 </p><p>与组关联的捕获输入始终是与组最近匹配的子序列。如果由于量化的缘故再次计算了组，则在第二次计算失败时将保留其以前捕获的值（如果有的话）例如，将字符串 <tt><font face="新宋体">"aba"</font></tt> 与表达式 <tt><font face="新宋体">(a(b)?)+</font></tt> 相匹配，会将第二组设置为 <tt><font face="新宋体">"b"</font></tt>。在每个匹配的开头，所有捕获的输入都会被丢弃。 </p><p>以 <tt><font face="新宋体">(?)</font></tt> 开头的组是纯的<i>非捕获</i> 组，它不捕获文本，也不针对组合计进行计数。 </p><h4>Unicode 支持 </h4><p>此类符合 <a href="http://www.unicode.org/reports/tr18/"><i>Unicode Technical Standard #18:Unicode Regular Expression Guidelines</i></a> 第 1 级和 RL2.1 Canonical Equivalents。 </p><p>Java 源代码中的 Unicode 转义序列（如 <tt><font face="新宋体">\u2014</font></tt>）是按照 Java Language Specification 的 <a href="http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html#100850">第 3.3 节</a>中的描述处理的。这样的转义序列还可以由正则表达式分析器直接实现，以便在从文件或键盘击键读取的表达式中使用 Unicode 转义。因此，可以将不相等的字符串 <tt><font face="新宋体">"\u2014"</font></tt> 和 <tt><font face="新宋体">"\\u2014"</font></tt> 编译为相同的模式，从而与带有十六进制值 <tt><font face="新宋体">0x2014</font></tt> 的字符匹配。 <a name="ubc"><p>与 Perl 中一样，Unicode 块和类别是使用 <tt><font face="新宋体">\p</font></tt> 和 <tt><font face="新宋体">\P</font></tt> 构造编写的。如果输入具有属性 <i>prop</i>，则与 <tt><font face="新宋体">\p{</font></tt><i>prop</i><tt><font face="新宋体">}</font></tt> 匹配，而输入具有该属性时与 \P{<i>prop</i><tt><font face="新宋体">}</font></tt> 不匹配。块使用前缀 <tt><font face="新宋体">In</font></tt> 指定，与在 <tt><font face="新宋体">InMongolian</font></tt> 中一样。可以使用可选前缀 <tt><font face="新宋体">Is</font></tt> 指定类别：<tt><font face="新宋体">\p{L}</font></tt> 和 <tt><font face="新宋体">\p{IsL}</font></tt> 都表示 Unicode 字母的类别。块和类别在字符类的内部和外部都可以使用。 </p><p>受支持的类别是由 <a title="java.lang 中的类" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/Character.html"><code><font face="新宋体">Character</font></code></a> 类指定版本中的 <a href="http://www.unicode.org/unicode/standard/standard.html"><i>The Unicode Standard</i></a> 的类别。类别名称是在 Standard 中定义的，即标准又丰富。<code><font face="新宋体">Pattern</font></code> 所支持的块名称是 <a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/Character.UnicodeBlock.html#forName(java.lang.String)"><code><font face="新宋体">UnicodeBlock.forName</font></code></a> 所接受和定义的有效块名称。 <a name="jcc"><p>行为类似 java.lang.Character boolean 是 <i>methodname</i> 方法（废弃的类别除外）的类别，可以通过相同的 <tt><font face="新宋体">\p{</font></tt><i>prop</i><tt><font face="新宋体">}</font></tt> 语法来提供，其中指定的属性具有名称 <tt><font face="新宋体">java<i>methodname</i></font></tt>。 </p><h4>与 Perl 5 相比较 </h4><p><code><font face="新宋体">Pattern</font></code> 引擎用有序替换项执行传统上基于 NFA 的匹配，与 Perl 5 中进行的相同。 </p><p>此类不支持 Perl 构造： </p><ul><li><p>条件构造 <tt><font face="新宋体">(?{</font></tt><i>X</i><tt><font face="新宋体">})</font></tt> 和 <tt><font face="新宋体">(?(</font></tt><i>condition</i><tt><font face="新宋体">)</font></tt><i>X</i><tt><font face="新宋体">|</font></tt><i>Y</i><tt><font face="新宋体">)</font></tt>、 </p></li><li><p>嵌入式代码构造 <tt><font face="新宋体">(?{</font></tt><i>code</i><tt><font face="新宋体">})</font></tt> 和 <tt><font face="新宋体">(??{</font></tt><i>code</i><tt><font face="新宋体">})</font></tt>、</p></li><li><p>嵌入式注释语法 <tt><font face="新宋体">(?#comment)</font></tt> 和 </p></li><li><p>预处理操作 <tt><font face="新宋体">\l</font></tt><tt><font face="新宋体">\u</font></tt>、<tt><font face="新宋体">\L</font></tt> 和 <tt><font face="新宋体">\U</font></tt>。</p></li></ul><p>此类支持但 Perl 不支持的构造： </p><ul><li><p>Possessive 数量词，它可以尽可能多地进行匹配，即使这样做导致所有匹配都成功时也如此。 </p></li><li><p>字符类并集和交集，如<a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#cc">上文</a>所述。</p></li></ul><p>与 Perl 的显著不同点是： </p><ul><li><p>在 Perl 中，<tt><font face="新宋体">\1</font></tt> 到 <tt><font face="新宋体">\9</font></tt> 始终被解释为 Back 引用；如果至少存在多个子表达式，则大于 <tt><font face="新宋体">9</font></tt> 的反斜线转义数按 Back 引用对待，否则在可能的情况下，它将被解释为八进制转义。在此类中，八进制转义必须始终以零开头。在此类中，<tt><font face="新宋体">\1</font></tt> 到 <tt><font face="新宋体">\9</font></tt> 始终被解释为 Back 引用，较大的数被接受为 Back 引用，如果在正则表达式中至少存在多个子表达式的话；否则，分析器将删除数字，直到该数小于或等于组的现有数或者其为一个数字。 </p></li><li><p>Perl 使用 <tt><font face="新宋体">g</font></tt> 标志请求恢复最后匹配丢失的匹配。此功能是由 <a title="java.util.regex 中的类" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Matcher.html"><code><font face="新宋体">Matcher</font></code></a> 类显式提供的：重复执行 <a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Matcher.html#find()"><code><font face="新宋体">find</font></code></a> 方法调用可以恢复丢失的最后匹配，除非匹配器被重置。 </p></li><li><p>在 Perl 中，位于表达式顶级的嵌入式标记对整个表达式都有影响。在此类中，嵌入式标志始终在它们出现的时候才起作用，不管它们位于顶级还是组中；在后一种情况下，与在 Perl 中类似，标志在组的结尾处还原。 </p></li><li><p>Perl 允许错误匹配构造，如在表达式 <tt><font face="新宋体">*a</font></tt> 中，以及不匹配的括号，如在在表达式 <tt><font face="新宋体">abc]</font></tt> 中，并将其作为字面值对待。此类还接受不匹配的括号，但对 +、? 和 * 不匹配元字符有严格限制；如果遇到它们，则抛出 <a title="java.util.regex 中的类" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/PatternSyntaxException.html"><code><font face="新宋体">PatternSyntaxException</font></code></a>。 </p></li></ul><p>有关正则表达式构造行为更准确的描述，请参见《<a href="http://www.oreilly.com/catalog/regex2/"><i>Mastering Regular Expressions, 2nd Edition</i></a>》，该书由 Jeffrey E. F. Friedl、O'Reilly 和 Associates 合著，于 2002 年出版。 </p><p></p><p></p><dl><dt><b>从以下版本开始：</b></dt><dd>1.4 
</dd><dt><b>另请参见：</b></dt><dd><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/String.html#split(java.lang.String, int)"><code><font face="新宋体">String.split(String, int)</font></code></a>, <a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/String.html#split(java.lang.String)"><code><font face="新宋体">String.split(String)</font></code></a>, <a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/serialized-form.html#java.util.regex.Pattern">序列化表格</a></dd></dl><hr /><p><!-- =========== FIELD SUMMARY =========== --><a name="field_summary"><!-- --></a></p><table cellspacing="0" cellpadding="3" width="100%" summary="" border="1"><tbody><tr class="TableHeadingColor" bgcolor="#ccccff"><th align="left" colspan="2"><font size="+2"><b>字段摘要</b></font></th></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font face="新宋体" size="-1"><code>static int</code></font></td><td><code><b><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#CANON_EQ"><font face="新宋体">CANON_EQ</font></a></b></code><br />          启用规范等价。</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font face="新宋体" size="-1"><code>static int</code></font></td><td><code><b><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#CASE_INSENSITIVE"><font face="新宋体">CASE_INSENSITIVE</font></a></b></code><br />          启用不区分大小写的匹配。</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font face="新宋体" size="-1"><code>static int</code></font></td><td><code><b><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#COMMENTS"><font face="新宋体">COMMENTS</font></a></b></code><br />          模式中允许空白和注释。</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font face="新宋体" size="-1"><code>static int</code></font></td><td><code><b><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#DOTALL"><font face="新宋体">DOTALL</font></a></b></code><br />          启用 dotall 模式。</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font face="新宋体" size="-1"><code>static int</code></font></td><td><code><b><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#LITERAL"><font face="新宋体">LITERAL</font></a></b></code><br />          启用模式的字面值分析。</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font face="新宋体" size="-1"><code>static int</code></font></td><td><code><b><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#MULTILINE"><font face="新宋体">MULTILINE</font></a></b></code><br />          启用多行模式。</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font face="新宋体" size="-1"><code>static int</code></font></td><td><code><b><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#UNICODE_CASE"><font face="新宋体">UNICODE_CASE</font></a></b></code><br />          启用 Unicode 感知的大小写折叠。</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font face="新宋体" size="-1"><code>static int</code></font></td><td><code><b><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#UNIX_LINES"><font face="新宋体">UNIX_LINES</font></a></b></code><br />          启用 Unix 行模式。</td></tr></tbody></table>  <!-- ========== METHOD SUMMARY =========== --><a name="method_summary"><!-- --></a><table cellspacing="0" cellpadding="3" width="100%" summary="" border="1"><tbody><tr class="TableHeadingColor" bgcolor="#ccccff"><th align="left" colspan="2"><font size="+2"><b>方法摘要</b></font></th></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font size="-1"><code><font face="新宋体">static </font><a title="java.util.regex 中的类" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html"><font face="新宋体">Pattern</font></a></code></font></td><td><code><b><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#compile(java.lang.String)"><font face="新宋体">compile</font></a></b><font face="新宋体">(</font><a title="java.lang 中的类" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/String.html"><font face="新宋体">String</font></a><font face="新宋体"> regex)</font></code><br />          将给定的正则表达式编译到模式中。</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font size="-1"><code><font face="新宋体">static </font><a title="java.util.regex 中的类" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html"><font face="新宋体">Pattern</font></a></code></font></td><td><code><b><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#compile(java.lang.String, int)"><font face="新宋体">compile</font></a></b><font face="新宋体">(</font><a title="java.lang 中的类" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/String.html"><font face="新宋体">String</font></a><font face="新宋体"> regex, int flags)</font></code><br />          将给定的正则表达式编译到具有给定标志的模式中。</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font face="新宋体" size="-1"><code> int</code></font></td><td><code><b><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#flags()"><font face="新宋体">flags</font></a></b><font face="新宋体">()</font></code><br />          返回此模式的匹配标志。</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font size="-1"><code><font face="新宋体"> </font><a title="java.util.regex 中的类" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Matcher.html"><font face="新宋体">Matcher</font></a></code></font></td><td><code><b><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#matcher(java.lang.CharSequence)"><font face="新宋体">matcher</font></a></b><font face="新宋体">(</font><a title="java.lang 中的接口" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/CharSequence.html"><font face="新宋体">CharSequence</font></a><font face="新宋体"> input)</font></code><br />          创建匹配给定输入与此模式的匹配器。</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font face="新宋体" size="-1"><code>static boolean</code></font></td><td><code><b><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#matches(java.lang.String, java.lang.CharSequence)"><font face="新宋体">matches</font></a></b><font face="新宋体">(</font><a title="java.lang 中的类" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/String.html"><font face="新宋体">String</font></a><font face="新宋体"> regex, </font><a title="java.lang 中的接口" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/CharSequence.html"><font face="新宋体">CharSequence</font></a><font face="新宋体"> input)</font></code><br />          编译给定正则表达式并尝试将给定输入与其匹配。</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font size="-1"><code><font face="新宋体"> </font><a title="java.lang 中的类" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/String.html"><font face="新宋体">String</font></a></code></font></td><td><code><b><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#pattern()"><font face="新宋体">pattern</font></a></b><font face="新宋体">()</font></code><br />          返回在其中编译过此模式的正则表达式。</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font size="-1"><code><font face="新宋体">static </font><a title="java.lang 中的类" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/String.html"><font face="新宋体">String</font></a></code></font></td><td><code><b><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#quote(java.lang.String)"><font face="新宋体">quote</font></a></b><font face="新宋体">(</font><a title="java.lang 中的类" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/String.html"><font face="新宋体">String</font></a><font face="新宋体"> s)</font></code><br />          返回指定 <code><font face="新宋体">String</font></code> 的字面值模式 <code><font face="新宋体">String</font></code>。</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font size="-1"><code><font face="新宋体"> </font><a title="java.lang 中的类" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/String.html"><font face="新宋体">String</font></a><font face="新宋体">[]</font></code></font></td><td><code><b><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#split(java.lang.CharSequence)"><font face="新宋体">split</font></a></b><font face="新宋体">(</font><a title="java.lang 中的接口" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/CharSequence.html"><font face="新宋体">CharSequence</font></a><font face="新宋体"> input)</font></code><br />          围绕此模式的匹配拆分给定输入序列。</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font size="-1"><code><font face="新宋体"> </font><a title="java.lang 中的类" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/String.html"><font face="新宋体">String</font></a><font face="新宋体">[]</font></code></font></td><td><code><b><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#split(java.lang.CharSequence, int)"><font face="新宋体">split</font></a></b><font face="新宋体">(</font><a title="java.lang 中的接口" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/CharSequence.html"><font face="新宋体">CharSequence</font></a><font face="新宋体"> input, int limit)</font></code><br />          围绕此模式的匹配拆分给定输入序列。</td></tr><tr class="TableRowColor" bgcolor="white"><td valign="top" align="right" width="1%"><font size="-1"><code><font face="新宋体"> </font><a title="java.lang 中的类" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/String.html"><font face="新宋体">String</font></a></code></font></td><td><code><b><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/util/regex/Pattern.html#toString()"><font face="新宋体">toString</font></a></b><font face="新宋体">()</font></code><br />          返回此模式的字符串表示形式。</td></tr></tbody></table> <a name="methods_inherited_from_class_java.lang.Object"><!-- --></a><table cellspacing="0" cellpadding="3" width="100%" summary="" border="1"><tbody><tr class="TableSubHeadingColor" bgcolor="#eeeeff"><th align="left"><b>从类 java.lang.<a title="java.lang 中的类" href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/Object.html">Object</a> 继承的方法</b></th></tr><tr class="TableRowColor" bgcolor="white"><td><code><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/Object.html#clone()"><font face="新宋体">clone</font></a><font face="新宋体">, </font><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/Object.html#equals(java.lang.Object)"><font face="新宋体">equals</font></a><font face="新宋体">, </font><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/Object.html#finalize()"><font face="新宋体">finalize</font></a><font face="新宋体">, </font><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/Object.html#getClass()"><font face="新宋体">getClass</font></a><font face="新宋体">, </font><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/Object.html#hashCode()"><font face="新宋体">hashCode</font></a><font face="新宋体">, </font><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/Object.html#notify()"><font face="新宋体">notify</font></a><font face="新宋体">, </font><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/Object.html#notifyAll()"><font face="新宋体">notifyAll</font></a><font face="新宋体">, </font><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/Object.html#wait()"><font face="新宋体">wait</font></a><font face="新宋体">, </font><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/Object.html#wait(long)"><font face="新宋体">wait</font></a><font face="新宋体">, </font><a href="mk:@MSITStore:C:\Documents%20and%20Settings\new\桌面\Java5.0API_CH\Java5.0API_CH.CHM::/Java5.0API_CH/java/lang/Object.html#wait(long, int)"><font face="新宋体">wait</font></a></code></td></tr></tbody></table></a></p><p></p><br />这样下来检验email的代码也是相当简单呀....<br />     boolean b = Pattern.matches("^\\w+@\\w+(<a href="file://.//w">\\.\\w</a>+)+", email);<br /></a></p><p></p></a></p><p></p></a></p><p></p></a></p><p></p></a></a></p><p></p><img src ="http://www.blogjava.net/heiyuchuanxia/aggbug/81974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/heiyuchuanxia/" target="_blank">Stefanie</a> 2006-11-18 22:38 <a href="http://www.blogjava.net/heiyuchuanxia/archive/2006/11/18/81974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入JAVA初始化</title><link>http://www.blogjava.net/heiyuchuanxia/archive/2006/11/05/79193.html</link><dc:creator>Stefanie</dc:creator><author>Stefanie</author><pubDate>Sun, 05 Nov 2006 06:43:00 GMT</pubDate><guid>http://www.blogjava.net/heiyuchuanxia/archive/2006/11/05/79193.html</guid><wfw:comment>http://www.blogjava.net/heiyuchuanxia/comments/79193.html</wfw:comment><comments>http://www.blogjava.net/heiyuchuanxia/archive/2006/11/05/79193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/heiyuchuanxia/comments/commentRss/79193.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/heiyuchuanxia/services/trackbacks/79193.html</trackback:ping><description><![CDATA[      最近的程序中总是出现写奇怪的问题....于是乎就查了一点相关的资料....找到了这样一片相关的文章....感觉收获挺多了.....      分享分享.......<br />  <br />      关于Java 初始化，有多文章都用了很大篇幅的介绍。经典的&lt;&lt;Thinking in java&gt;&gt;更是用了专门的一章来介绍Java初始化。但在大量有代码实例后面，感觉上仍然没有真正深入到初始化的本质。 
<p>　　本文以作者对JVM的理解和自己的经验，对Java的初始化做一个比深入的说明，由于作者有水平限制，以及JDK各实现版本的变化，可能仍然有不少错误和缺点。欢迎行家高手赐教。</p><p>　　要深入了解Java初始化，我们无法知道从程序流程上知道JVM是按什么顺序来执行的。了解JVM的执行机制和堆栈跟踪是有效的手段。可惜的是，到目前为止。JDK1。4和JDK1。5在javap功能上却仍然存在着BUG。所以有些过程我无法用实际的结果向你证明两种相反的情况。</p><p>　　&lt;&lt;Thinking in java&gt;&gt;(第三版)在第四章一开始的时候,这样来描述Java的初始化工作:</p><p>　　以下译文原文:</p><p>　　可以这样认为,每个类都有一个名为Initialize()的方法,这个名字就暗示了它得在使用之前调用,不幸的是,这么做的话,用户就得记住要调用这个方法,java类库的设计者们可以通过一种被称为构造函数的特殊方法,来保证每个对象都能得到被始化.如果类有构造函数,那么java就会在对象刚刚创建,用户还来不及得到的时候,自动调用那个构造函数,这样初始化就有保障了。</p><p>　　我不知道原作者的描述和译者的理解之间有多大的差异,结合全章,我没有发现两个最关键的字"&lt;clinit&gt;"和"&lt;init&gt;"。至少说明原作者和译者并没有真正说明JVM在初始化时做了什么,或者说并不了解JVM的初始化内幕,要不然明明有这两个方法,却为什么要认为有一个事实上并不存在的"Initialize()"方法呢?</p><p>　　"&lt;clinit&gt;"和"&lt;init&gt;"方法在哪里？这两个方法是实际存在而你又找不到的方法，也许正是这样才使得一些大师都犯晕。加上jdk实现上的一些BUG，如果没有深入了解，真的让人摸不着北。</p><p>　　现在科学体系有一个奇怪的现象，那么庞大的体系最初都是建立在一个假设的基础是，假设1是正确的，由此推导出2，再继续推导出10000000000。可惜的是太多的人根本不在乎2-100000000000这样的体系都是建立在假设1是正确的基础上的。我并不会用“可以这样认为”这样的假设，我要确实证明"&lt;clinit&gt;"和"&lt;init&gt;"方法是真真实实的存在的：</p><pre class="code"> package debug;
 public class MyTest{
  static int i = 100/0;
  public static void main(String[] args){
   Ssytem.out.println("Hello,World!");
  }
 }
</pre><p>　　执行一下看看,这是jdk1.5的输出：</p><pre class="code">java.lang.ExceptionInInitializerError
Caused by: java.lang.ArithmeticException: / by zero
 at debug.MyTest.<clinit>(Test.java:3)
Exception in thread "main" 
</clinit></pre><p>　　请注意，和其它方法调用时产生的异常一样，异常被定位于debug.MyTest的&lt;clinit&gt;.</p><p>　　再来看：</p><pre class="code">package debug;
public class Test {
  Test(){
      int i = 100 / 0;
  }
  public static void main(String[] args) {
    new Test();
  }
}<br />jdk1.5输入：<br /> Exception in thread "main" java.lang.ArithmeticException: / by zero
  at debug.Test.&lt;init&gt;(Test.java:4)
  at debug.Test.main(Test.java:7)
<br />JVM并没有把异常定位在Test()构造方法中，而是在debug.Test.&lt;init&gt;。<p>　　当我们看到了这两个方法以后，我们再来详细讨论这两个“内置初始化方法”（我并不喜欢生造一些</p><p>　　非标准的术语，但我确实不知道如何规范地称呼他们）。</p><p>　　内置初始化方法是JVM在内部专门用于初始化的特有方法，而不是提供给程序员调用的方法，事实上“&lt;&gt;”这样的语法在源程序中你连编译都无法通过。这就说明，初始化是由JVM控制而不是让程序员来控制的。</p><h3>类初始化方法：&lt;clinit&gt;</h3><p>　　我没有从任何地方了解到&lt;clinit&gt;的cl是不是class的简写，但这个方法确实是用来对“类”进行初</p><p>　　始化的。换句话说它是用来初始化static上下文的。</p><p>　　在类装载（load）时，JVM会调用内置的&lt;clinit&gt;方法对类成员和静态初始化块进行初始化调用。它们的顺序按照源文件的原文顺序。</p><p>　　我们稍微增加两行static语句：</p><pre class="code">package debug;
public class Test {
  static int x = 0;
  static String s = "123";
  static {
    String s1 = "456";
    if(1==1)
    throw new RuntimeException();
  }
  public static void main(String[] args) {
    new Test();
  }
}
</pre><p>　　然后进行反编译：</p><pre class="code">javap -c debug.Test
Compiled from "Test.java"
public class debug.Test extends java.lang.Object{
static int x;
static java.lang.String s;
public debug.Test();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return
public static void main(java.lang.String[]);
  Code:
   0:   new     #2; //class debug/Test
   3:   dup
   4:   invokespecial   #3; //Method "<init>":()V
   7:   pop
   8:   return
static {};
  Code:
   0:   iconst_0
   1:   putstatic       #4; //Field x:I
   4:   ldc     #5; //String 123
   6:   putstatic       #6; //Field s:Ljava/lang/String;
   9:   ldc     #7; //String 456
   11:  astore_0
   12:  new     #8; //class java/lang/RuntimeException
   15:  dup
   16:  invokespecial   #9; //Method java/lang/RuntimeException."<init>":()V
   19:  athrow<br />我们可以看到,类初始化正是按照源文件中定义的原文顺序进行。先是声明<pre class="code">  static  int x;
  static  java.lang.String s;</pre><p>　　然后对int x和String s进行赋值：</p><pre class="code">   0:   iconst_0
   1:   putstatic       #4; //Field x:I
   4:   ldc     #5; //String 123
   6:   putstatic       #6; //Field s:Ljava/lang/String;
</pre><p>　　执行初始化块的String s1 = "456";生成一个RuntimeException抛</p><pre class="code">   9:   ldc     #7; //String 456
   11:  astore_0
   12:  new     #8; //class java/lang/RuntimeException
   15:  dup
   16:  invokespecial   #9; //Method java/lang/RuntimeException."<init>":()V
   19:  athrow
</init></pre><p>　　要明白的是，"&lt;clinit&gt;"方法不仅是类初始化方法，而且也是接口初始化方法。并不是所以接口</p><p>　　的属性都是内联的，只有直接赋常量值的接口常量才会内联。而</p><p>　　[public static final] double d = Math.random()*100;</p><p>　　这样的表达式是需要计算的，在接口中就要由"&lt;clinit&gt;"方法来初始化。</p><h3>下面我们再来看看实例初始化方法"&lt;init&gt;"</h3><p>　　"&lt;init&gt;"用于对象创建时对对象进行初始化，当在HEAP中创建对象时，一旦在HEAP分配了空间。最先就会调用"&lt;init&gt;"方法。这个方法包括实例变量的赋值（声明不在其中）和初始化块，以及构造方法调用。如果有多个重载的构造方法，每个构造方法都会有一个对应的"&lt;init&gt;"方法。构造方法隐式或显示调用父类的构造方法前,总是先执行实例变量初始化和初始化块.同样，实例变量和初始化块的顺序也是按源文件的原文顺序执行，构造方法中的代码在最后执行：</p><br /><pre class="code">package debug;
public class Test {
  int x = 0;
  String s = "123";
  {
    String s1 = "456";
    //if(1==1)
    //throw new RuntimeException();
  }
  public Test(){
    String ss = "789";
  }
  public static void main(String[] args) {
    new Test();
  }
}
javap -c debug.Test的结果：
Compiled from "Test.java"
public class debug.Test extends java.lang.Object{
int x;
java.lang.String s;
public debug.Test();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   aload_0
   5:   iconst_0
   6:   putfield        #2; //Field x:I
   9:   aload_0
   10:  ldc     #3; //String 123
   12:  putfield        #4; //Field s:Ljava/lang/String;
   15:  ldc     #5; //String 456
   17:  astore_1
   18:  ldc     #6; //String 789
   20:  astore_1
   21:  return
public static void main(java.lang.String[]);
  Code:
   0:   new     #7; //class debug/Test
   3:   dup
   4:   invokespecial   #8; //Method "<init>":()V
   7:   pop
   8:   return
}
</init></init></pre><p>　　如果在同一个类中，一个构造方法调用了另一个构造方法，那么对应的"&lt;init&gt;"方法就会调用另一</p><p>　　个"&lt;init&gt;"，但是实例变量和初始化块会被忽略，否则它们就会被多次执行。</p><pre class="code">package debug;
public class Test {
  String s1 = rt("s1");
  String s2 = "s2";
  
  public Test(){
    s1 = "s1";
  }
  public Test(String s){
    this();
    if(1==1) throw new Runtime();
  }
  String rt(String s){
    return s;
  }
  public static void main(String[] args) {
    new Test("");
  }
}
</pre><p>　　反编译的结果：</p><pre class="code">Compiled from "Test.java"
public class debug.Test extends java.lang.Object{
java.lang.String s1;
java.lang.String s2;
public debug.Test();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   aload_0
   5:   aload_0
   6:   ldc     #2; //String s1
   8:   invokevirtual   #3; //Method rt:(Ljava/lang/String;)Ljava/lang/String;
   11:  putfield        #4; //Field s1:Ljava/lang/String;
   14:  aload_0
   15:  ldc     #5; //String s2
   17:  putfield        #6; //Field s2:Ljava/lang/String;
   20:  aload_0
   21:  ldc     #2; //String s1
   23:  putfield        #4; //Field s1:Ljava/lang/String;
   26:  return
public debug.Test(java.lang.String);
  Code:
   0:   aload_0
   1:   invokespecial   #7; //Method "<init>":()V
   4:   new     #8; //class java/lang/RuntimeException
   7:   dup
   8:   invokespecial   #9; //Method java/lang/RuntimeException."<init>":()V
   11:  athrow
java.lang.String rt(java.lang.String);
  Code:
   0:   aload_1
   1:   areturn
public static void main(java.lang.String[]);
  Code:
   0:   new     #10; //class debug/Test
   3:   dup
   4:   ldc     #11; //String
   6:   invokespecial   #12; //Method "<init>":(Ljava/lang/String;)V
   9:   pop
   10:  return
}
</init></init></init></init></pre><p>　　我们看到，由于Test(String s)调用了Test();所以"&lt;init&gt;":(Ljava/lang/String;)V不再对</p><p>　　实例变量和初始化块进次初始化：</p><pre class="code">public debug.Test(java.lang.String);
  Code:
   0:   aload_0
   1:   invokespecial   #7; //Method "<init>":()V
   4:   new     #8; //class java/lang/RuntimeException
   7:   dup
   8:   invokespecial   #9; //Method java/lang/RuntimeException."<init>":()V
   11:  athrow
</init></init></pre><p>　　而如果两个构造方法是相互独立的，则每个构造方法调用前都会执行实例变量和初始化块的调用：</p><pre class="code">package debug;
public class Test {
  String s1 = rt("s1");
  String s2 = "s2";
  {
    String s3 = "s3";
  }
  public Test() {
    s1 = "s1";
  }
  public Test(String s) {
    if (1 == 1) 
      throw new RuntimeException();
  }
  String rt(String s) {
    return s;
  }
  public static void main(String[] args) {
    new Test("");
  }
}
</pre><p>　　反编译的结果：</p><pre class="code">Compiled from "Test.java"
public class debug.Test extends java.lang.Object{
java.lang.String s1;
java.lang.String s2;
public debug.Test();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   aload_0
   5:   aload_0
   6:   ldc     #2; //String s1
   8:   invokevirtual   #3; //Method rt:(Ljava/lang/String;)Ljava/lang/String;
   11:  putfield        #4; //Field s1:Ljava/lang/String;
   14:  aload_0
   15:  ldc     #5; //String s2
   17:  putfield        #6; //Field s2:Ljava/lang/String;
   20:  ldc     #7; //String s3
   22:  astore_1
   23:  aload_0
   24:  ldc     #2; //String s1
   26:  putfield        #4; //Field s1:Ljava/lang/String;
   29:  return
public debug.Test(java.lang.String);
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   aload_0
   5:   aload_0
   6:   ldc     #2; //String s1
   8:   invokevirtual   #3; //Method rt:(Ljava/lang/String;)Ljava/lang/String;
   11:  putfield        #4; //Field s1:Ljava/lang/String;
   14:  aload_0
   15:  ldc     #5; //String s2
   17:  putfield        #6; //Field s2:Ljava/lang/String;
   20:  ldc     #7; //String s3
   22:  astore_2
   23:  new     #8; //class java/lang/RuntimeException
   26:  dup
   27:  invokespecial   #9; //Method java/lang/RuntimeException."<init>":()V
   30:  athrow
java.lang.String rt(java.lang.String);
  Code:
   0:   aload_1
   1:   areturn
public static void main(java.lang.String[]);
  Code:
   0:   new     #10; //class debug/Test
   3:   dup
   4:   ldc     #11; //String
   6:   invokespecial   #12; //Method "<init>":(Ljava/lang/String;)V
   9:   pop
   10:  return
}
</init></init></init></init></pre><p>　　明白了上面这些知识,我们来做一个小测试吧:</p><pre class="code">public class Test2 extends Test1{
 {
  System.out.print("1");
 }
 Test2(){
  System.out.print("2");
 }
 static{
  System.out.print("3");
 }
 {
  System.out.print("4");
 }
 public static void main(String[] args) {
  new Test2();
 }
}
class Test1 {
 Test1(){
  System.out.print("5"); 
 }
 static{
  System.out.print("6");
 }
}
</pre><p>　　试试看能清楚打印的顺序吗?如果没有new Test2()将打印什么?</p><br />作者:axman  专栏:http://blog.csdn.net/axman/
</init></init></init></pre></pre><img src ="http://www.blogjava.net/heiyuchuanxia/aggbug/79193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/heiyuchuanxia/" target="_blank">Stefanie</a> 2006-11-05 14:43 <a href="http://www.blogjava.net/heiyuchuanxia/archive/2006/11/05/79193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>