﻿<?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-红玫瑰-文章分类-J2EE学习笔记</title><link>http://www.blogjava.net/vaga/category/4663.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 02 Apr 2007 06:42:47 GMT</lastBuildDate><pubDate>Mon, 02 Apr 2007 06:42:47 GMT</pubDate><ttl>60</ttl><item><title>正则表达式介绍（转）</title><link>http://www.blogjava.net/vaga/articles/107738.html</link><dc:creator>vaga</dc:creator><author>vaga</author><pubDate>Sun, 01 Apr 2007 04:30:00 GMT</pubDate><guid>http://www.blogjava.net/vaga/articles/107738.html</guid><wfw:comment>http://www.blogjava.net/vaga/comments/107738.html</wfw:comment><comments>http://www.blogjava.net/vaga/articles/107738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/vaga/comments/commentRss/107738.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vaga/services/trackbacks/107738.html</trackback:ping><description><![CDATA[
		<span id="BlogViewId" be:lasthandle="cns!469896FD4541AE6!157" be:firsthandle="cns!469896FD4541AE6!265" be:sortkey="" be:sortmode="Normal">
				<span>
						<h3>目录</h3>
						<p>
								<strong>正则表达式介绍</strong>
						</p>
						<ol>
								<li>匹配模式</li>
								<li>字符子集</li>
								<li>行结束符</li>
								<li>分组和引用</li>
								<li>Unicode 支持</li>
						</ol>
						<p>
								<strong>正则表达式语法参考</strong>
								<br />
						</p>
						<ol>
								<li>字符</li>
								<li>逻辑操作符</li>
								<li>向后引用</li>
								<li>边界元字符</li>
								<li>重复指示符</li>
								<li>字符子集</li>
								<li>预定义子集（元字符）</li>
								<li>扩展子集（元字符） 
</li>
								<li>扩展中文子集（元字符）</li>
								<li>POSIX字符子集（只适用于ASCII）</li>
								<li>Unicode块和分类</li>
						</ol>
						<p>
								<strong>替换表达式<br /></strong>
						</p>
						<ol>
								<li>特殊字符</li>
								<li>自定义替换表<br /></li>
						</ol>
						<hr width="100%" size="2" />
						<h3>
								<a>
								</a>匹配模式</h3>匹配模式指得是正则表达式引擎将以何种模式匹配字符串。<br /><table cellspacing="2" cellpadding="2" width="100%" border="1"><tbody><tr><td valign="top">模式名称<br /></td><td valign="top">启用，禁用<br /></td><td valign="top">缺省启用<br /></td><td valign="top">说明<br /></td></tr><tr><td valign="top">UNIX_LINES<br /></td><td valign="top">(?d)启用，(?-d)禁用<br /></td><td valign="top">是<br /></td><td valign="top">启用Unix行模式。<br />在此模式下，只有 <tt>'\n'</tt>被认为是行结束符。它会影响<tt>.</tt>, <tt>^</tt>, 和 <tt>$</tt> 的行为。<br /><br /></td></tr><tr><td valign="top">CASE_INSENSITIVE<br /></td><td valign="top">(?i)启用，(?-i)禁用<br /></td><td valign="top">否<br /></td><td valign="top">启用忽略大小写模式。<br />缺省时，忽略大小写模式只会影响 ASCII字符的匹配。 而Unicode范围的忽略大小写匹配需要通过 UNICODE_CASE 标志与本标志联合使用。<br />启用此模式会影响匹配性能。<br /><br /></td></tr><tr><td valign="top">COMMENTS<br /></td><td valign="top">(?x)启用，(?-x)禁用<br /></td><td valign="top">否<br /></td><td valign="top">允许空格和注释出现在正则表达式中。<br />在此模式下，空格被忽略，以#开始的单行注释被忽略。 <br /></td></tr><tr><td valign="top">MULTILINE<br /></td><td valign="top">(?m)启用，(?-m)禁用<br /></td><td valign="top">是<br /></td><td valign="top">启用多行模式。<br />In multiline mode the expressions <tt>^</tt> and <tt>$</tt> match just after or just before, respectively, a line terminator or the end of the input sequence. By default these expressions only match at the beginning and the end of the entire input sequence. <br /><br /></td></tr><tr><td valign="top">DOTALL<br /></td><td valign="top">(?s)启用，(?-s)禁用<br /></td><td valign="top">否<br /></td><td valign="top">让.可以匹配行结束符。<br />在此模式下，元字符<tt>.</tt>可以匹配行结束符。缺省不允许如此匹配。<br /><br /><br /></td></tr><tr><td valign="top">UNICODE_CASE<br /></td><td valign="top">(?u)启用，(?-u)禁用<br /></td><td valign="top">否<br /></td><td valign="top">Enables Unicode-aware case folding.<br />When this flag is specified then case-insensitive matching, when enabled by the <code>CASE_INSENSITIVE</code> flag, is done in a manner consistent with the Unicode Standard. By default, case-insensitive matching assumes that only characters in the US-ASCII charset are being matched. 启用此模式会影响性能。<br /><br /></td></tr><tr><td valign="top">CANON_EQ<br /></td><td valign="top">(?c)启用，(?-c)禁用<br /></td><td valign="top">否<br /></td><td valign="top">Enables canonical equivalence.<br />When this flag is specified then two characters will be considered to match if, and only if, their full canonical decompositions match. The expression <tt>"a\u030A"</tt>, for example, will match the string <tt>"?"</tt> when this flag is specified. By default, matching does not take canonical equivalence into account. <br />启用此模式会影响性能。<br /><br /></td></tr></tbody></table><br /><br /><h3><a></a>字符子集</h3>字符子集可以含有别的字符子集，并且可以通过联合操作符（缺省）和交集操作符（&amp;&amp;）实现组合。联合操作符表示某个子集匹配它的子子集所匹配的任意字符。交集操作符表明某个字符子集只匹配它的子子集都匹配的字符。<br />字符子集所能够有的操作符的优先级如下，从高到低：<br /><ol><li>转义符\x 
</li><li>成组符 [...] 
</li><li>区间符 a-z 
</li><li>联合符 [a-e][i-u] 
</li><li>交集符 [a-z&amp;&amp;[aeiou]]</li></ol>注意：在字符子集[]内部的语法根本不同于正则表达式其它部分中的语法。例如，在字符子集内部，正则表达式 . 失去了它原有的含义，而是成了一个匹配.的元字符。 <br /><br /><h3><a></a>行结束符</h3>行结束符是一个或两个字符序列，用以表明输入字符序列中一行的结束。下面的字符被认为是行结束符：<br /><ul><li>一个换行符('\n')。 
</li><li>一个回车符加上一个换行符("\r\n")。 
</li><li>一个单独的回车符('\r')。 
</li><li>代表下一行的字符('\u0085')。 
</li><li>行分隔符('\u2028')，Unicode中被定义。 
</li><li>一个分段符('\u2029)，Unicode中被定义。</li></ul>如果 UNIX_LINES 模式被启用，则只有换行符被认为是行结束符。<br />如果 MULTILINE 模式被启用，。<br /><br /><h3><a></a>分组和引用</h3>字符分组以它们的左括号的出现顺序来排序。例如在表达式((A)(B(C)))，有四个分组：<br /><ol><li>((A)(B(C))) 
</li><li>(A) 
</li><li>(B(C)) 
</li><li>(C)</li></ol>第0组永远表示表达式本身。<br />分组采用这样的命名方式，是因为，在一次匹配过程中，正则表达式会被匹配多次。以前的匹配子序列有可能在将来被使用；或者在匹配结束时，程序有可能需要重新获得所有匹配的子字符序列。<br />对于正则表达式中的某个分组而言，永远只保留最后匹配的字符序列。如果对某个分组匹配尝试失败，则会保留上次匹配成功的字符序列。例如，对于正则表达式(a(b)?)+而言，字符序列"aba"，将会让分组2匹配的字符序列为"b"。<br />以(?开始的分组，将不会计入分组数目，也不会被后续匹配所引用。<br /><br /><h3><a></a>Unicode支持</h3>本正则表达式匹配引擎的实现遵循了《<a href="http://www.unicode.org/unicode/reports/tr18/">Unicode技术报告：Unicode正则表达式指南</a>》，实现了该指南的第二层所需的功能，但是在细微处有一些简单语法修改。<br />Unicode块(Block)和分类(Category)通过\p和\P通配苻表示。\p{<b><i>prop</i></b>}匹配含有<b><i>prop</i></b>的输入序列，而\P{<b><i>prop</i></b>}匹配不含有<b><i>prop</i></b>的输入序列。Unicode块通过前缀<tt>In</tt>表示，如\p{InMongolian}。Unicode分类通过可选的前缀Is表示，因此\p{L}和\p{IsL}都代表Unicode分类 letters。Unicode块和分类都可以在正则表达式子集外部和内部使用。<br />目前支持的Unicode块和分类是《<a href="http://www.unicode.org/unicode/standard/standard.html">Unicode标准，第三版</a>》中所指定的块和分类。 Unicode块名称在《<a href="http://www.unicode.org/Public/3.0-Update/UnicodeCharacterDatabase-3.0.0.html">Unicode 字符数据库</a>》的第14章被定义，文件名称叫<a href="http://www.unicode.org/Public/3.0-Update/Blocks-3.txt">Blocks-3.txt</a>，但是名称中的空格被去掉了。例如"Basic Latin"成了"BasicLatin"。无论是标准化的还是非标准化的分类，都在该标准的第88页的第4-5表中被全部定义。<br /><br /><h3><a></a>与Perl 5正则表达式语法对比 </h3>[TBD]<br /><br /><hr width="100%" size="2" /><h2><a></a>正则表达式参考</h2><br /><hr width="100%" size="2" /><h3><a></a>字符</h3><table cellspacing="2" cellpadding="2" width="100%" border="1"><tbody><tr><td valign="top" width="30%">正则表达式字符串<br /></td><td valign="top">匹配的字符串<br /></td></tr><tr><td valign="top" width="30%">X<br /></td><td valign="top">字符X，包括 CJK ExtB 区汉字<br /></td></tr><tr><td valign="top" width="30%">\\<br /></td><td valign="top">反斜杠\<br /></td></tr><tr><td valign="top" width="30%">\0<b><i>n</i></b></td><td valign="top">八进制0<b><i>n</i></b>代表的字符(0&lt;=n&lt;=7)<br /></td></tr><tr><td valign="top" width="30%">\0<b><i>nn</i></b><br /></td><td valign="top">八进制0<b><i>nn</i></b>代表的字符(0&lt;=n&lt;=7)<br /></td></tr><tr><td valign="top" width="30%">\0<b><i>mnn</i></b><br /></td><td valign="top">八进制0<b><i>mnn</i></b>代表的字符(0&lt;=m&lt;=3,0&lt;=n&lt;=7)<br /></td></tr><tr><td valign="top" width="30%">\x<b><i>hh</i></b><br /></td><td valign="top">十六进制 0x<b><i>hh</i></b>所代表的字符<br /></td></tr><tr><td valign="top" width="30%">\u<b><i>hhhh</i></b><br /></td><td valign="top">十六进制 0x<b><i>hhhh</i></b>所代表的字符。<font color="#ff0000">注意</font>，目前尚不支持CJK ExtB区汉字。<br /></td></tr><tr><td valign="top" width="30%">\t<br /></td><td valign="top">制表符('\u0009')<br /></td></tr><tr><td valign="top">\n<br /></td><td valign="top">换行('\u000A')<br /></td></tr><tr><td valign="top">\r<br /></td><td valign="top">回车('\u000D')<br /></td></tr><tr><td valign="top">\a<br /></td><td valign="top">响铃符('\u0007')<br /></td></tr><tr><td valign="top">\e<br /></td><td valign="top">取消符Escape('\001B')<br /></td></tr><tr><td valign="top">\c<i><b>x</b></i><br /></td><td valign="top"><i><b>x</b></i>所代表的控制字符<br /></td></tr></tbody></table><br /><h3><a></a>逻辑操作符</h3><table cellspacing="2" cellpadding="2" width="100%" border="1"><tbody><tr><td valign="top" width="30%">正则表达式字符串<br /></td><td valign="top">匹配的字符串<br /></td></tr><tr><td valign="top" width="30%"><i>XY</i><br /></td><td valign="top"><i>X</i>后面跟随<i>Y</i><br /></td></tr><tr><td valign="top" width="30%"><i>X</i>|<i>Y</i><br /></td><td valign="top"><i>X</i>或者<i>Y</i><br /></td></tr><tr><td valign="top" width="30%">(<i>X</i>)<br /></td><td valign="top"><i>X</i>作为分组表达式<br /></td></tr></tbody></table><br /><h3><a></a>向后引用</h3><table cellspacing="2" cellpadding="2" width="100%" border="1"><tbody><tr><td valign="top" width="30%">正则表达式字符串<br /></td><td valign="top">匹配的字符串<br /></td></tr><tr><td valign="top" width="30%">\<b>n</b><br /></td><td valign="top">第<b>n</b>个匹配的分组<br /></td></tr></tbody></table><br /><h3><a></a>边界元字符</h3><table cellspacing="2" cellpadding="2" width="100%" border="1"><tbody><tr><td valign="top" width="30%">边界字符<br /></td><td valign="top">匹配的字符串<br /></td></tr><tr><td valign="top" width="30%">^<br /></td><td valign="top">行首<br /></td></tr><tr><td valign="top" width="30%">$<br /></td><td valign="top">行末<br /></td></tr><tr><td valign="top" width="30%">\b </td><td valign="top">字符边界<br /></td></tr><tr><td valign="top" width="30%">\B<br /></td><td valign="top">非字符边界<br /></td></tr><tr><td valign="top" width="30%">\A<br /></td><td valign="top">输入流的开始<br /></td></tr><tr><td valign="top" width="30%">\G<br /></td><td valign="top">上次匹配的结束处<br /></td></tr><tr><td valign="top" width="30%">\Z<br /></td><td valign="top">输入流的结束，或者是最后一个行结束符，参见<a>行结束符</a>。<br /></td></tr><tr><td valign="top" width="30%">\z<br /></td><td valign="top">输入流的结束<br /></td></tr></tbody></table><br /><h3><a></a>重复指示符</h3><table cellspacing="2" cellpadding="2" width="100%" border="1"><tbody><tr><td valign="top" width="30%">正则表达式字符串<br /></td><td valign="top">匹配的字符串<br /></td></tr><tr><td valign="top" width="30%"><b>X</b>?<br /></td><td valign="top"><b>X</b>重复一次，或者不重复<br /></td></tr><tr><td valign="top" width="30%"><b>X</b>*<br /></td><td valign="top"><b>X</b>重复0次或多次<br /></td></tr><tr><td valign="top" width="30%"><b>X</b>+ <br /></td><td valign="top"><b>X</b>重复1次或多次<br /></td></tr><tr><td valign="top" width="30%"><b>X</b>{n}<br /></td><td valign="top"><b>X</b>重复n次，不多也不少。<br /></td></tr><tr><td valign="top" width="30%"><b>X</b>{n,}<br /></td><td valign="top"><b>X</b>至少重复n次<br /></td></tr><tr><td valign="top" width="30%"><b>X</b>{n,m}<br /></td><td valign="top"><b>X</b>至少重复n次，至多重复m次。<br /></td></tr></tbody></table>注：<b>X</b>{n,m}、?、*、+方式可以联合使用。<br /><br /><h3><a></a>字符子集</h3><table cellspacing="2" cellpadding="2" width="100%" border="1"><tbody><tr><td valign="top" width="30%">正则表达式字符串子集<br /></td><td valign="top" width="50%">匹配的字符串<br /></td><td valign="top" align="left" width="20%">组合方式<br /></td></tr><tr><td valign="top" width="30%">[abc]<br /></td><td valign="top" width="60%">字符a,b或c，包括 CJK ExtB 区汉字<br /></td><td valign="top" align="left" width="20%">简单子集<br /></td></tr><tr><td valign="top" width="30%">[^abc]<br /></td><td valign="top" width="60%">任意非a,b或c的字符。<br /></td><td valign="top" align="left" width="20%">排除<br /></td></tr><tr><td valign="top" width="30%">[a-zA-Z] </td><td valign="top" width="60%">从a到z，或者A到Z，包含a,z,A,Z。<br /></td><td valign="top" align="left" width="20%">区间<br /></td></tr><tr><td valign="top" width="30%">[a-d[m-p]]<br /></td><td valign="top" width="60%">从a到d，或者m到p，等于[a-dm-p]。<br /></td><td valign="top" align="left" width="20%">联合<br /></td></tr><tr><td valign="top" width="30%">[a-z&amp;&amp;[def]]<br /></td><td valign="top" width="60%">d,e或者f。<br /></td><td valign="top" align="left" width="20%">交集<br /></td></tr><tr><td valign="top">[a-z&amp;&amp;[^bc]]<br /></td><td valign="top" width="60%">从a到z，除了b和c，等于[ad-z]<br /></td><td valign="top" align="left" width="20%">扣除<br /></td></tr><tr><td valign="top">[a-z&amp;&amp;[^m-p]]<br /></td><td valign="top">从a到z，并且不包括从m到p，等于[a-lq-z]<br /></td><td valign="top">扣除<br /></td></tr></tbody></table><br /><h3><a></a>预定义子集（元字符）</h3><table cellspacing="2" cellpadding="2" width="100%" border="1"><tbody><tr><td valign="top" width="30%">边界字符<br /></td><td valign="top">匹配的字符串<br /></td></tr><tr><td valign="top" width="30%">.<br /></td><td valign="top">任意字符，可能匹配行结束符。<br /></td></tr><tr><td valign="top" width="30%">\d<br /></td><td valign="top">数字[0-9]<br /></td></tr><tr><td valign="top" width="30%">\D </td><td valign="top">非数字[^0-9]<br /></td></tr><tr><td valign="top" width="30%">\s<br /></td><td valign="top">空白符[ \t\n\x0B\f\r]<br /></td></tr><tr><td valign="top" width="30%">\S<br /></td><td valign="top">非空白符[^\s]<br /></td></tr><tr><td valign="top" width="30%">\w<br /></td><td valign="top">单词符，包含有字母和数字[a-zA-Z_0-9]<br /></td></tr><tr><td valign="top" width="30%">\W<br /></td><td valign="top">非单词符，不包含有字母和数字。<br /></td></tr></tbody></table><br /><h3>扩展子集（元字符）</h3><table cellspacing="2" cellpadding="2" width="100%" border="1"><tbody><tr><td valign="top" width="30%">正则表达式字符串<br /></td><td valign="top">匹配的字符串<br /></td></tr><tr><td valign="top" width="30%"><br /></td><td valign="top"><br /></td></tr></tbody></table><br /><br /><h3><a></a>扩展中文子集（元字符）</h3><table cellspacing="2" cellpadding="2" width="100%" border="1"><tbody><tr><td valign="top">名称<br /></td><td valign="top">块名称（\p{InXXX}）<br /></td><td valign="top">简化通配符<br /></td><td valign="top">标准Unicode块，或者汉字列表<br /></td></tr><tr><td valign="top">任意双字节字符（汉字或全角符号）<br /></td><td valign="top">\p{InQuqnJiao}<br /></td><td valign="top">\E<br /></td><td valign="top">任意由GBK表示的汉字，不包括GB18030扩展部分，<br />以及CJK ExtB区的汉字。<br /></td></tr><tr><td valign="top">任意单字节字符<br /></td><td valign="top">\p{InFQuanJiao}<br /></td><td valign="top">\~E<br /></td><td valign="top">任意单字节字符。<br /></td></tr><tr><td valign="top">任意全角ASCII字符<br /></td><td valign="top">\p{InQJAscii}<br /></td><td valign="top">\H<br /></td><td valign="top">标准HalfwidthandFullwidthForms块<br /></td></tr><tr><td valign="top">任意收录在BIG5码集中的双字节字符<br /></td><td valign="top">\p{InBig5}<br /></td><td valign="top">\I<br /></td><td valign="top">Big5可编码双字节字符<br /></td></tr><tr><td valign="top">匹配未收录在BIG5码集中的双字节字符 </td><td valign="top">\p{InFBig5}<br /></td><td valign="top">\~I<br /></td><td valign="top">非Big5可编码双字节字符<br /></td></tr><tr><td valign="top">匹配任意汉字(不包括符号)<br /></td><td valign="top">\p{InHanziOrCJKExtB}<br /></td><td valign="top">\X<br /></td><td valign="top">任意汉字，包括GB18030扩展部分。<br /></td></tr><tr><td valign="top">匹配任意汉字(不包括符号)<br /></td><td valign="top">\p{InHanzi}<br /></td><td valign="top">\M<br /></td><td valign="top">任意汉字，不包括GB18030扩展部分。<br /></td></tr><tr><td valign="top">匹配非汉字的双字节字符<br /></td><td valign="top">\p{InFHanzi}<br /></td><td valign="top">\~M<br /></td><td valign="top">任意非汉字的双字节字符，<br />包括GB18030扩展部分。<br /></td></tr><tr><td valign="top">地支字符<br /></td><td valign="top">\p{InDiZhi}<br /></td><td valign="top">\U<br /></td><td valign="top">子丑寅卯辰巳午未申酉戌亥<br /></td></tr><tr><td valign="top">匹配收录在GB码集中的双字节字符<br /></td><td valign="top">\p{InGB}<br /></td><td valign="top">\g<br /></td><td valign="top">收录在GB码集中的双字节字符，<br />不包括GB18030扩展部分。<br /></td></tr><tr><td valign="top">匹配非收录在GB码集中的双字节字符<br /></td><td valign="top">\p{InFGB}<br /></td><td valign="top">\~g<br /></td><td valign="top">未收录在GB码集中的双字节字符，<br />不包括GB18030扩展部分。<br /></td></tr><tr><td valign="top">匹配收录在GBK码集中的双字节字符<br /></td><td valign="top">\p{InGBK}<br /></td><td valign="top">\h<br /></td><td valign="top">收录在GBK码集中的双字节字符，<br />不包括GB18030扩展部分。<br /></td></tr><tr><td valign="top">匹配非收录在GBK码集中的双字节字符<br /></td><td valign="top">\p{InFGBK}<br /></td><td valign="top">\~h<br /></td><td valign="top">未收录在GBK码集中的双字节字符，<br />不包括GB18030扩展部分。<br /></td></tr><tr><td valign="top">大写希腊字母<br /></td><td valign="top">\p{InDaXila}<br /></td><td valign="top">\K<br /></td><td valign="top">ΑΒΓΔΕΖΗΘΙΚΛΜΝ<br />ΞΟΠΡΣΤΥΦΧΨΩ<br /></td></tr><tr><td valign="top">日文片假名<br /></td><td valign="top">\p{InPianJia}<br /></td><td valign="top">\j<br /></td><td valign="top">标准Katakana块<br /></td></tr><tr><td valign="top">日文平假名<br /></td><td valign="top">\p{InPingJia}<br /></td><td valign="top">\J<br /></td><td valign="top">标准Hiragana块<br /></td></tr><tr><td valign="top">小写希腊字母<br /></td><td valign="top">\p{InXiaoXila}<br /></td><td valign="top">\k<br /></td><td valign="top">αβγδεζηθικλμν<br />ξοπρστυφχψω<br /></td></tr><tr><td valign="top">数学符号<br /></td><td valign="top">\p{InMathe}<br /></td><td valign="top">\m<br /></td><td valign="top">±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙<br />∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴<br /></td></tr><tr><td valign="top">中文数字<br /></td><td valign="top">\p{InCnDigit}<br /></td><td valign="top">\i<br /></td><td valign="top">〇一二三四五六七八九十百千万亿兆吉京<br /></td></tr><tr><td valign="top">大写中文数字<br /></td><td valign="top">\p{InDaCnDigit}<br /></td><td valign="top">\N<br /></td><td valign="top">零壹贰叁肆伍陆柒捌玖拾佰仟萬亿兆吉京<br /></td></tr><tr><td valign="top">全角标点符号<br /></td><td valign="top">\p{InQJBiaoDian}<br /></td><td valign="top">\o<br /></td><td valign="top">、。·ˉˇ¨〃々—～‖…‘’“”〔〕<br />〈〉《》「」『』〖〗【】！＂＇（），<br />－．：；＜＝＞？［］｛｜｝｀﹉﹊﹋﹌﹍﹎﹏﹐﹑﹒﹔﹕﹖﹗﹙﹚<br />﹛﹜﹝﹞︵︶︹︺︿﹀︽︾﹁﹂﹃﹄<br />︻︼︷︸︱︳︴<br /></td></tr><tr><td valign="top">小写俄文字母<br /></td><td valign="top">\p{InXiaoEWen}<br /></td><td valign="top">\l<br /></td><td valign="top">абвгдеёжзийклмн<br />опрстуфхцчшщъыьэюя<br /></td></tr><tr><td valign="top">大写俄文字母<br /></td><td valign="top">\p{InDaEWen}<br /></td><td valign="top">\R<br /></td><td valign="top">АБВГДЕЁЖЗИЙКЛМНО<br />ПРСТУФХЦЧШЩЪЫЬЭЮЯ<br /></td></tr><tr><td valign="top">中文序号<br /></td><td valign="top">\p{InCnSN}<br /></td><td valign="top">\q<br /></td><td valign="top">ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ<br />ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ<br />再加上Unicode标准EnclosedAlphanumerics块<br /></td></tr><tr><td valign="top">天干字符<br /></td><td valign="top">\p{InTianGan}<br /></td><td valign="top">\T<br /></td><td valign="top">甲乙丙丁戊己庚辛壬癸<br /></td></tr><tr><td valign="top">竖排标点符号<br /></td><td valign="top">\p{InSPBiaoDian}<br /></td><td valign="top">\V<br /></td><td valign="top">︵︶︹︺︿﹀︽︾﹁﹂﹃﹄︻︼︷︸︱︳︴<br /></td></tr><tr><td valign="top">拼音字符<br /></td><td valign="top">\p{InPinyin}<br /></td><td valign="top">\y<br /></td><td valign="top">āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑńňɡ<br />GBK -&gt; 0xA8A1- 0xA8C0<br />只是Unicode标准LatinExtended-A块的一部分。<br /></td></tr><tr><td valign="top">注音字符<br /></td><td valign="top">\p{InZhuyin}<br /></td><td valign="top">\Y<br /></td><td valign="top">标准Bopomofo块<br /></td></tr><tr><td valign="top">制表字符<br /></td><td valign="top">\p{InZhiBiao}<br /></td><td valign="top">\C<br /></td><td valign="top">标准BoxDrawing块。<br />经检查发现 textpro 的算法含有部分非标<br />准Unicode制表符：“∟∣≒≦≧⊿═”。<br /></td></tr></tbody></table><br /><h3><a></a>POSIX字符子集（只适用于ASCII）</h3><table cellspacing="2" cellpadding="2" width="100%" border="1"><tbody><tr><td valign="top" width="30%">正则表达式字符串<br /></td><td valign="top">匹配的字符串<br /></td></tr><tr><td valign="top" width="30%">\p{Lower}<br /></td><td valign="top">小写字母[a-z]<br /></td></tr><tr><td valign="top" width="30%">\p{Upper}<br /></td><td valign="top">大写字母[A-Z]<br /></td></tr><tr><td valign="top" width="30%">\p{ASCII}<br /></td><td valign="top">所有的ASCII字符[\x00-\x7F]<br /></td></tr><tr><td valign="top" width="30%">\p{Alpha}<br /></td><td valign="top">大小写字母[\p{Lower}\p{Upper}]<br /></td></tr><tr><td valign="top" width="30%">\p{Digit}<br /></td><td valign="top">数字[0-9]<br /></td></tr><tr><td valign="top" width="30%">\p{Alnum}<br /></td><td valign="top">字母数字符，包含大小写字母和数字[\p{Alpha}\p{Digit}]<br /></td></tr><tr><td valign="top" width="30%">\p{Punct}<br /></td><td valign="top">标点符号，!"#$%&amp;'()*+,-./:;&lt;=&gt;?@[\]^_`{|}~之一。<br /></td></tr><tr><td valign="top" width="30%">\p{Graph}<br /></td><td valign="top">可显示字符[\p{Alnum}\p{Punct}]<br /></td></tr><tr><td valign="top">\p{Print}<br /></td><td valign="top">可打印字符[\p{Graph}]<br /></td></tr><tr><td valign="top">\p{Blank}<br /></td><td valign="top">空格或者制表符[ \t]<br /></td></tr><tr><td valign="top">\p{Cntrl}<br /></td><td valign="top">控制字符[\x00-\x1F\x7F<br /></td></tr><tr><td valign="top">\p{XDigit}<br /></td><td valign="top">十六进制数字[0-9a-fA-F]<br /></td></tr><tr><td valign="top">\p{Space}<br /></td><td valign="top">空白符[ \t\n\x0B\f\r]<br /></td></tr></tbody></table><br /><h3><a></a>Unicode块和分类</h3><table cellspacing="2" cellpadding="2" width="100%" border="1"><tbody><tr><td valign="top">块<br /></td><td valign="top">中文名称（摘自Word XP）<br /></td><td valign="top">代码区域<br /></td></tr><tr><td valign="top">BasicLatin<br /></td><td valign="top">基本拉丁语<br /></td><td valign="top">\u0000-\u007F<br /></td></tr><tr><td valign="top">Latin-1Supplement<br /></td><td valign="top">拉丁语-1<br /></td><td valign="top">\u0080-\u00FF<br /></td></tr><tr><td valign="top">LatinExtended-A<br /></td><td valign="top">拉丁语扩充-A<br /></td><td valign="top">\u0100-\u017F<br /></td></tr><tr><td valign="top">LatinExtended-Bound<br /></td><td valign="top">拉丁语扩充-B<br /></td><td valign="top">\u0180-\u024F<br /></td></tr><tr><td valign="top">IPAExtensions<br /></td><td valign="top">国际音标扩充<br /></td><td valign="top">\u0250-\u02AF<br /></td></tr><tr><td valign="top">SpacingModifierLetters<br /></td><td valign="top">进格的修饰字符<br /></td><td valign="top">\u02B0-\u02FF<br /></td></tr><tr><td valign="top">CombiningDiacriticalMarks<br /></td><td valign="top">组合用发音符<br /></td><td valign="top">\u0300-\u036F<br /></td></tr><tr><td valign="top">Greek<br /></td><td valign="top">基本希腊语<br /></td><td valign="top">\u0370-\u03FF<br /></td></tr><tr><td valign="top">Cyrillic<br /></td><td valign="top">西里尔语<br /></td><td valign="top">\u0400-\u04FF<br /></td></tr><tr><td valign="top">Armenian<br /></td><td valign="top"><br /></td><td valign="top">\u0530-\u058F<br /></td></tr><tr><td valign="top">Hebrew<br /></td><td valign="top"><br /></td><td valign="top">\u0590-\u05FF<br /></td></tr><tr><td valign="top">Arabic<br /></td><td valign="top"><br /></td><td valign="top">\u0600-\u06FF<br /></td></tr><tr><td valign="top">Syriac<br /></td><td valign="top"><br /></td><td valign="top">\u0700-\u074F<br /></td></tr><tr><td valign="top">Thaana<br /></td><td valign="top"><br /></td><td valign="top">\u0780-\u07BF<br /></td></tr><tr><td valign="top">Devanagari<br /></td><td valign="top"><br /></td><td valign="top">\u0900-\u097F<br /></td></tr><tr><td valign="top">Bengali<br /></td><td valign="top"><br /></td><td valign="top">\u0980-\u09FF<br /></td></tr><tr><td valign="top">Gurmukhi<br /></td><td valign="top"><br /></td><td valign="top">\u0A00-\u0A7F<br /></td></tr><tr><td valign="top">Gujarati<br /></td><td valign="top"><br /></td><td valign="top">\u0A80-\u0AFF<br /></td></tr><tr><td valign="top">Oriya<br /></td><td valign="top"><br /></td><td valign="top">\u0B00-\u0B7F<br /></td></tr><tr><td valign="top">Tamil<br /></td><td valign="top"><br /></td><td valign="top">\u0B80-\u0BFF<br /></td></tr><tr><td valign="top">Telugu<br /></td><td valign="top"><br /></td><td valign="top">\u0C00-\u0C7F<br /></td></tr><tr><td valign="top">Kannada<br /></td><td valign="top"><br /></td><td valign="top">\u0C80-\u0CFF<br /></td></tr><tr><td valign="top">Malayalam<br /></td><td valign="top"><br /></td><td valign="top">\u0D00-\u0D7F<br /></td></tr><tr><td valign="top">Sinhala<br /></td><td valign="top"><br /></td><td valign="top">\u0D800-\uDFF<br /></td></tr><tr><td valign="top">Thai<br /></td><td valign="top"><br /></td><td valign="top">\u0E00-\u0E7F<br /></td></tr><tr><td valign="top">Lao<br /></td><td valign="top"><br /></td><td valign="top">\u0E80-\u0EFF<br /></td></tr><tr><td valign="top">Tibetan<br /></td><td valign="top">藏语<br /></td><td valign="top">\u0F00-\u0FFF<br /></td></tr><tr><td valign="top">Myanmar<br /></td><td valign="top"><br /></td><td valign="top">\u1000-\u109F<br /></td></tr><tr><td valign="top">Georgian<br /></td><td valign="top"><br /></td><td valign="top">\u10A0-\u10FF<br /></td></tr><tr><td valign="top">HangulJamo<br /></td><td valign="top"><br /></td><td valign="top">\u1100-\u11FF<br /></td></tr><tr><td valign="top">Ethiopic<br /></td><td valign="top"><br /></td><td valign="top">\u1200-\u137F<br /></td></tr><tr><td valign="top">Cherokee<br /></td><td valign="top"><br /></td><td valign="top">\u13A0-\u13FF<br /></td></tr><tr><td valign="top">UnifiedCanadianAboriginalSyllabics<br /></td><td valign="top"><br /></td><td valign="top">\u1400-\u167F<br /></td></tr><tr><td valign="top">Ogham<br /></td><td valign="top"><br /></td><td valign="top">\u1680-\u169F<br /></td></tr><tr><td valign="top">Runic<br /></td><td valign="top"><br /></td><td valign="top">\u16A0-\u16FF<br /></td></tr><tr><td valign="top">Khmer<br /></td><td valign="top"><br /></td><td valign="top">\u1780-\u17FF<br /></td></tr><tr><td valign="top">Mongolian<br /></td><td valign="top">蒙古语<br /></td><td valign="top">\u1800-\u18AF<br /></td></tr><tr><td valign="top">LatinExtendedAdditional<br /></td><td valign="top"><br /></td><td valign="top">\u1E00-\u1EFF<br /></td></tr><tr><td valign="top">GreekExtended<br /></td><td valign="top"><br /></td><td valign="top">\u1F00-\u1FFF<br /></td></tr><tr><td valign="top">GeneralPunctuation<br /></td><td valign="top">广义标点<br /></td><td valign="top">\u2000-\u206F<br /></td></tr><tr><td valign="top">SuperscriptsandSubscripts<br /></td><td valign="top"><br /></td><td valign="top">\u2070-\u209F<br /></td></tr><tr><td valign="top">CurrencySymbols<br /></td><td valign="top">货币符号<br /></td><td valign="top">\u20A0-\u20CF<br /></td></tr><tr><td valign="top">CombiningMarksforSymbols<br /></td><td valign="top"><br /></td><td valign="top">\u20D0-\u20FF<br /></td></tr><tr><td valign="top">LetterlikeSymbols<br /></td><td valign="top">类似字母的符号<br /></td><td valign="top">\u2100-\u214F<br /></td></tr><tr><td valign="top">NumberForms<br /></td><td valign="top">数字形式<br /></td><td valign="top">\u2150-\u218F<br /></td></tr><tr><td valign="top">Arrows<br /></td><td valign="top">箭头<br /></td><td valign="top">\u2190-\u21FF<br /></td></tr><tr><td valign="top">MathematicalOperators<br /></td><td valign="top">数学运算符<br /></td><td valign="top">\u2200-\u22FF<br /></td></tr><tr><td valign="top">MiscellaneousTechnical<br /></td><td valign="top">零杂技术用符号<br /></td><td valign="top">\u2300-\u23FF<br /></td></tr><tr><td valign="top">ControlPictures<br /></td><td valign="top"><br /></td><td valign="top">\u2400-\u243F<br /></td></tr><tr><td valign="top">OpticalCharacterRecognition<br /></td><td valign="top"><br /></td><td valign="top">\u2440-\u245F<br /></td></tr><tr><td valign="top">EnclosedAlphanumerics<br /></td><td valign="top">带括号的字母数字<br /></td><td valign="top">\u2460-\u24FF<br /></td></tr><tr><td valign="top">BoxDrawing<br /></td><td valign="top">制表符<br /></td><td valign="top">\u2500-\u257F<br /></td></tr><tr><td valign="top">BlockElements<br /></td><td valign="top">方块图形<br /></td><td valign="top">\u2580-\u259F<br /></td></tr><tr><td valign="top">GeometricShapes<br /></td><td valign="top">几何图形<br /></td><td valign="top">\u25A0-\u25FF<br /></td></tr><tr><td valign="top">MiscellaneousSymbols<br /></td><td valign="top">零杂丁贝符（示意符等）<br /></td><td valign="top">\u2600-\u26FF<br /></td></tr><tr><td valign="top">Dingbats<br /></td><td valign="top"><br /></td><td valign="top">\u2700-\u27BF<br /></td></tr><tr><td valign="top">BraillePatterns<br /></td><td valign="top"><br /></td><td valign="top">\u2800-\u28FF<br /></td></tr><tr><td valign="top">CJKRadicalsSupplement<br /></td><td valign="top"><br /></td><td valign="top">\u2E80-\u2EFF<br /></td></tr><tr><td valign="top">KangxiRadicals<br /></td><td valign="top"><br /></td><td valign="top">\u2F00-\u2FDF<br /></td></tr><tr><td valign="top">IdeographicDescriptionCharacters<br /></td><td valign="top"><br /></td><td valign="top">\u2FF0-\u2FFF<br /></td></tr><tr><td valign="top">CJKSymbolsandPunctuation<br /></td><td valign="top">CJK符号和标点<br /></td><td valign="top">\u3000-\u303F<br /></td></tr><tr><td valign="top">Hiragana<br /></td><td valign="top">平假名<br /></td><td valign="top">\u3040-\u309F<br /></td></tr><tr><td valign="top">Katakana<br /></td><td valign="top">片假名<br /></td><td valign="top">\u30A0-\u30FF<br /></td></tr><tr><td valign="top">Bopomofo<br /></td><td valign="top">注音<br /></td><td valign="top">\u3100-\u312F<br /></td></tr><tr><td valign="top">HangulCompatibilityJamo<br /></td><td valign="top"><br /></td><td valign="top">\u3130-\u318F<br /></td></tr><tr><td valign="top">Kanbun<br /></td><td valign="top"><br /></td><td valign="top">\u3190-\u319F<br /></td></tr><tr><td valign="top">BopomofoExtended<br /></td><td valign="top">扩展注音<br /></td><td valign="top">\u31A0-\u31BF<br /></td></tr><tr><td valign="top">EnclosedCJKLettersandMonths<br /></td><td valign="top">带括号的CJK字母及月份<br /></td><td valign="top">\u3200-\u32FF<br /></td></tr><tr><td valign="top">CJKCompatibility<br /></td><td valign="top">CJK兼容字符<br /></td><td valign="top">\u3300-\u33FF <br /></td></tr><tr><td valign="top">CJKUnifiedIdeographsExtensionA<br /></td><td valign="top">CJK统一汉字扩展-A<br /></td><td valign="top">\u3400-\u4dBF<br /></td></tr><tr><td valign="top">CJKUnifiedIdeographs<br /></td><td valign="top">CJK统一汉字<br /></td><td valign="top">\u4E00-\u9fAF<br /></td></tr><tr><td valign="top">YiSyllables<br /></td><td valign="top"><br /></td><td valign="top">\uA000-\uA48F<br /></td></tr><tr><td valign="top">YiRadicals<br /></td><td valign="top"><br /></td><td valign="top">\uA490-\uA4CF<br /></td></tr><tr><td valign="top">HangulSyllables<br /></td><td valign="top"><br /></td><td valign="top">\uAC00-\uD7A3<br /></td></tr><tr><td valign="top">HighSurrogates<br /></td><td valign="top"><br /></td><td valign="top">\uD800-\uDB7F<br /></td></tr><tr><td valign="top">HighPrivateUseSurrogates<br /></td><td valign="top"><br /></td><td valign="top">\uDB80-\uDBFF<br /></td></tr><tr><td valign="top">LowSurrogates<br /></td><td valign="top"><br /></td><td valign="top">\uDC00-\uDFFF<br /></td></tr><tr><td valign="top">PrivateUse<br /></td><td valign="top">专用区<br /></td><td valign="top">\uE000-\uF8FF<br /></td></tr><tr><td valign="top">CJKCompatibilityIdeographs<br /></td><td valign="top">CJK兼容汉字<br /></td><td valign="top">\uF900-\uFAFF<br /></td></tr><tr><td valign="top">AlphabeticPresentationForms<br /></td><td valign="top"><br /></td><td valign="top">\uFB00-\uFB4F<br /></td></tr><tr><td valign="top">ArabicPresentationForms-A<br /></td><td valign="top"><br /></td><td valign="top">\uFB50-\uFDFF<br /></td></tr><tr><td valign="top">CombiningHalfMarks<br /></td><td valign="top"><br /></td><td valign="top">\uFE20-\uFE2F<br /></td></tr><tr><td valign="top">CJKCompatibilityForms<br /></td><td valign="top">CJK兼容形式<br /></td><td valign="top">\uFE30-\uFE4F<br /></td></tr><tr><td valign="top">SmallFormVariants<br /></td><td valign="top">小写变体<br /></td><td valign="top">\uFE50-\uFE6F<br /></td></tr><tr><td valign="top">ArabicPresentationForms-Bound<br /></td><td valign="top"><br /></td><td valign="top">\uFE70-\ufeFF<br /></td></tr><tr><td valign="top">Specials<br /></td><td valign="top"><br /></td><td valign="top">\uFFF0-\uFFFF<br /></td></tr><tr><td valign="top">HalfwidthandFullwidthForms<br /></td><td valign="top">半形及全形字符<br /></td><td valign="top">\uFF00-\uFFEF<br /></td></tr></tbody></table><br /><br /><table cellspacing="2" cellpadding="2" width="100%" border="1"><tbody><tr><td valign="top">分类<br /></td><td valign="top">全称<br /></td><td valign="top">说明<br /></td></tr><tr><td valign="top">Cn<br /></td><td valign="top"><br /></td><td valign="top">UNASSIGNED<br /></td></tr><tr><td valign="top">Lu<br /></td><td valign="top"><br /></td><td valign="top">UPPERCASE_LETTER<br /></td></tr><tr><td valign="top">Ll<br /></td><td valign="top"><br /></td><td valign="top">LOWERCASE_LETTER<br /></td></tr><tr><td valign="top">Lt<br /></td><td valign="top"><br /></td><td valign="top">TITLECASE_LETTER<br /></td></tr><tr><td valign="top">Lm<br /></td><td valign="top"><br /></td><td valign="top">MODIFIER_LETTER<br /></td></tr><tr><td valign="top">Lo<br /></td><td valign="top"><br /></td><td valign="top">OTHER_LETTER<br /></td></tr><tr><td valign="top">Mn<br /></td><td valign="top"><br /></td><td valign="top">NON_SPACING_MARK<br /></td></tr><tr><td valign="top">Me<br /></td><td valign="top"><br /></td><td valign="top">ENCLOSING_MARK<br /></td></tr><tr><td valign="top">Mc<br /></td><td valign="top"><br /></td><td valign="top">COMBINING_SPACING_MARK<br /></td></tr><tr><td valign="top">Nd<br /></td><td valign="top"><br /></td><td valign="top">DECIMAL_DIGIT_NUMBER<br /></td></tr><tr><td valign="top">Nl<br /></td><td valign="top"><br /></td><td valign="top">LETTER_NUMBER<br /></td></tr><tr><td valign="top">No<br /></td><td valign="top"><br /></td><td valign="top">OTHER_NUMBER<br /></td></tr><tr><td valign="top">Zs<br /></td><td valign="top"><br /></td><td valign="top">SPACE_SEPARATOR<br /></td></tr><tr><td valign="top">Zl<br /></td><td valign="top"><br /></td><td valign="top">LINE_SEPARATOR<br /></td></tr><tr><td valign="top">Zp<br /></td><td valign="top"><br /></td><td valign="top">PARAGRAPH_SEPARATOR<br /></td></tr><tr><td valign="top">Cc<br /></td><td valign="top"><br /></td><td valign="top">CNTRL<br /></td></tr><tr><td valign="top">Cf<br /></td><td valign="top"><br /></td><td valign="top">FORMAT<br /></td></tr><tr><td valign="top">Co<br /></td><td valign="top"><br /></td><td valign="top">PRIVATE_USE<br /></td></tr><tr><td valign="top">Cs<br /></td><td valign="top"><br /></td><td valign="top">SURROGATE<br /></td></tr><tr><td valign="top">Pd<br /></td><td valign="top"><br /></td><td valign="top">DASH_PUNCTUATION<br /></td></tr><tr><td valign="top">Ps<br /></td><td valign="top"><br /></td><td valign="top">START_PUNCTUATION<br /></td></tr><tr><td valign="top">Pe<br /></td><td valign="top"><br /></td><td valign="top">END_PUNCTUATION<br /></td></tr><tr><td valign="top">Pc<br /></td><td valign="top"><br /></td><td valign="top">CONNECTOR_PUNCTUATION<br /></td></tr><tr><td valign="top">Po<br /></td><td valign="top"><br /></td><td valign="top">OTHER_PUNCTUATION<br /></td></tr><tr><td valign="top">Sm<br /></td><td valign="top"><br /></td><td valign="top">MATH_SYMBOL<br /></td></tr><tr><td valign="top">Sc<br /></td><td valign="top"><br /></td><td valign="top">CURRENCY_SYMBOL<br /></td></tr><tr><td valign="top">Sk<br /></td><td valign="top"><br /></td><td valign="top">MODIFIER_SYMBOL<br /></td></tr><tr><td valign="top">So<br /></td><td valign="top"><br /></td><td valign="top">OTHER_SYMBOL<br /></td></tr><tr><td valign="top">L<br /></td><td valign="top"><br /></td><td valign="top">LETTER<br /></td></tr><tr><td valign="top">M<br /></td><td valign="top"><br /></td><td valign="top">MARK<br /></td></tr><tr><td valign="top">N<br /></td><td valign="top"><br /></td><td valign="top">NUMBER<br /></td></tr><tr><td valign="top">Z<br /></td><td valign="top"><br /></td><td valign="top">SEPARATOR<br /></td></tr><tr><td valign="top">C<br /></td><td valign="top"><br /></td><td valign="top">CONTROL<br /></td></tr><tr><td valign="top">P<br /></td><td valign="top"><br /></td><td valign="top">PUNCTUATION<br /></td></tr><tr><td valign="top">S<br /></td><td valign="top"><br /></td><td valign="top">SYMBOL </td></tr><tr><td valign="top">LD<br /></td><td valign="top"><br /></td><td valign="top">LETTER_OR_DIGIT<br /></td></tr><tr><td valign="top">L1<br /></td><td valign="top"><br /></td><td valign="top">Latin-1<br /></td></tr><tr><td valign="top">all<br /></td><td valign="top"><br /></td><td valign="top">ALL<br /></td></tr><tr><td valign="top">ASCII<br /></td><td valign="top"><br /></td><td valign="top">ASCII<br /></td></tr><tr><td valign="top">Alnum<br /></td><td valign="top"><br /></td><td valign="top">字母数字(0-9,a-z,A-Z)<br /></td></tr><tr><td valign="top">Alpha<br /></td><td valign="top"><br /></td><td valign="top">字母(a-z,A-Z)<br /></td></tr><tr><td valign="top">Blank<br /></td><td valign="top"><br /></td><td valign="top">空格和制表符(' '|\t)<br /></td></tr><tr><td valign="top">Cntrl<br /></td><td valign="top"><br /></td><td valign="top">控制字符，不可打印<br /></td></tr><tr><td valign="top">Digit<br /></td><td valign="top"><br /></td><td valign="top">数字(0-9)<br /></td></tr><tr><td valign="top">Graph<br /></td><td valign="top"><br /></td><td valign="top">可打印且可视字母（例如空格' '是可打印的但不是可视字母，而 `a' 两者都是。）<br /></td></tr><tr><td valign="top">Lower<br /></td><td valign="top"><br /></td><td valign="top">小写字母<br /></td></tr><tr><td valign="top">Print<br /></td><td valign="top"><br /></td><td valign="top">可打印字母（非控制字符）<br /></td></tr><tr><td valign="top">Punct<br /></td><td valign="top"><br /></td><td valign="top">标符号（字母、数字、控制、空白符以外的字母），如：!@#$%}{&lt;&gt;,./?[]等等。<br /></td></tr><tr><td valign="top">Space<br /></td><td valign="top"><br /></td><td valign="top">空白符(' ',\t,0x09,0x0A,0x0B,0x0C,0x0D,0x20)<br /></td></tr><tr><td valign="top">Upper<br /></td><td valign="top"><br /></td><td valign="top">大写字母<br /></td></tr><tr><td valign="top">XDigit<br /></td><td valign="top"><br /></td><td valign="top">十六进制数字(0-9，a-f, A-F)<br /></td></tr></tbody></table><br /><hr width="100%" size="2" /><br /><br /><br /><h3><a></a>替换表达式</h3><a></a>特殊字符<br /><table cellspacing="2" cellpadding="2" width="100%" border="1"><tbody><tr><td valign="top" width="30%">特殊字符介绍<br /></td><td valign="top">描述<br /></td></tr><tr><td valign="top" width="30%">\n<br /></td><td valign="top">换行<br /></td></tr><tr><td valign="top" width="30%">\b<br /></td><td valign="top">向前删除一个字符。当这个字符位于替换串之首时，将删除匹配串之前的一个字符。若匹配串位于行首，将使匹配串所在行与前一行相合并。<br /></td></tr><tr><td valign="top" width="30%">\d<br /></td><td valign="top">向后删除一个字符。当这个字符位于替换串之末时，将删除匹配串之后的一个字符。若匹配串位于行末，将使匹配串所在行与下一行相合并。<br /></td></tr><tr><td valign="top" width="30%">\e<br /></td><td valign="top">插入一个ESC字符<br /></td></tr><tr><td valign="top">\t<br /></td><td valign="top">插入一个TAB字符<br /></td></tr><tr><td valign="top">\<i><b>n</b></i><br /></td><td valign="top">n代表查找正则表达式中的子表达式（组）。\1代表第一个子表达式，\2代表第二个子表达式，依次类推。\0代表整个匹配到的字符串。<br /></td></tr><tr><td valign="top">\v<br /></td><td valign="top">大写下一个字母<br /></td></tr><tr><td valign="top">\U<br /></td><td valign="top">全部大写以后的字母，直到碰到其它指示符为止。<br /></td></tr><tr><td valign="top">\l<br /></td><td valign="top">小写下一个字母<br /></td></tr><tr><td valign="top">\L<br /></td><td valign="top">全部小写以后的字母，直到碰到其它指示符为止。<br /></td></tr><tr><td valign="top">\E<br /></td><td valign="top">取消所有的字母大小写指示符。<br /></td></tr></tbody></table><br /><br /><a></a>自定义替换表<br /><br />在查找／替换中使用自定义替换表 <br />有的时候，上述简单的自定义替换功能是不够的。例如，用户可能希望只把出现在括号内的源串替换为目标串。这种文本处理可以通过在查找/替换中使用自定义替换表来解决。 <br /><br />在查找/替换功能中使用自定义替换表的替换函数是\Tn，其中n是0-9的数字，注意n为0表示第10张替换表。如果略去n，其效果相当于\T1，即使用第一张替换表。例如要把所有放在方括号中的汉字替换为拼音，可以查找“\[(\ E)\]”，替换为“\T{\1}”。即把第一个子表达式的匹配内容按自定义替换表转换。注意，如果\T函数的参数不在替换表的源串中，\T函数的结果与源串相同，即不做任何变换。 <br /><br />有些情况下，用户可能希望只使用替换表的一部分内容。还是以拼音为例，前面给出的替换表中包含了拼音的音调，如果在替换时不希望加上这些音调数字，可以使用“过滤”功能。所谓过滤，其实是用一个正则表达式去分析替换表的目标串，并把其中的某个子表达式取出来。 <br /><br />使用“过滤”时，在“设置自定义替换表”对话框中，点“过滤”按钮，在弹出的对话框中填入一个正则表达式。再以拼音为例，表达式可以写为“(\p {Alpha}+)(\d)”，其中第一对括号中的是不含音调的拼音，第二对括号是音调。在调用\T函数时，JTextPro会在目标串中查找这个正则表达式。但是如何把其中的子表达式取出来呢？\T函数还有一个可选的下标，取第n个子表达式的值就写作\T{...}[n]。所以，把放在方括号中的汉字替换为不带调的拼音，可以查找“\[(\E)\]”，替换为“\T{\1}[1]” </span>
		</span>
<img src ="http://www.blogjava.net/vaga/aggbug/107738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vaga/" target="_blank">vaga</a> 2007-04-01 12:30 <a href="http://www.blogjava.net/vaga/articles/107738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[摘] Ajax : 一种网络应用的新理念</title><link>http://www.blogjava.net/vaga/articles/19115.html</link><dc:creator>vaga</dc:creator><author>vaga</author><pubDate>Thu, 10 Nov 2005 05:27:00 GMT</pubDate><guid>http://www.blogjava.net/vaga/articles/19115.html</guid><wfw:comment>http://www.blogjava.net/vaga/comments/19115.html</wfw:comment><comments>http://www.blogjava.net/vaga/articles/19115.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/vaga/comments/commentRss/19115.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vaga/services/trackbacks/19115.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Ajax : A New Approach to Web ApplicationsAjax :&nbsp;一种网络应用的新理念If anything about current interaction design can be called “glamorous,” it’s creating Web applications. After all, when was the last ...&nbsp;&nbsp;<a href='http://www.blogjava.net/vaga/articles/19115.html'>阅读全文</a><img src ="http://www.blogjava.net/vaga/aggbug/19115.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vaga/" target="_blank">vaga</a> 2005-11-10 13:27 <a href="http://www.blogjava.net/vaga/articles/19115.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[摘] MVC模式解析</title><link>http://www.blogjava.net/vaga/articles/19043.html</link><dc:creator>vaga</dc:creator><author>vaga</author><pubDate>Wed, 09 Nov 2005 12:31:00 GMT</pubDate><guid>http://www.blogjava.net/vaga/articles/19043.html</guid><wfw:comment>http://www.blogjava.net/vaga/comments/19043.html</wfw:comment><comments>http://www.blogjava.net/vaga/articles/19043.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/vaga/comments/commentRss/19043.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vaga/services/trackbacks/19043.html</trackback:ping><description><![CDATA[<H3><B><FONT size=2>MVC模式概述</FONT></B></H3><BR><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;MVC是三个单词的缩写,分别为：模型(Model),视图(View)和控制Controller)。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><STRONG>MVC模式的目的就是实现Web系统的职能分工：</STRONG>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Model层实现系统中的业务逻辑，通常可以用JavaBean或EJB来实现。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;View层用于与用户的交互，通常用JSP来实现。<BR>&nbsp;&nbsp;&nbsp;&nbsp;Controller层是Model与View之间沟通的桥梁，它可以分派用户的请求并选择恰当的视图以用于显示，同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。<BR><BR></FONT>
<H3><B><FONT size=2>MVC模式的好处</FONT></B></H3><FONT size=2><FONT style="BACKGROUND-COLOR: #ffc0cb">各施其职，互不干涉</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在MVC模式中，三个层各施其职，所以如果一旦哪一层的需求发生了变化，就只需要更改相应的层中的代码而不会影响到其它层中的代码。&nbsp;<BR><FONT style="BACKGROUND-COLOR: #ffc0cb">有利于开发中的分工<BR></FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在MVC模式中，由于按层把系统开，那么就能更好的实现开发中的分工。网页设计人员可以进行开发视图层中的JSP，对业务熟悉的开发人员可开发业务层，而其它开发人员可开发控制层。&nbsp;<BR><FONT style="BACKGROUND-COLOR: #ffc0cb">有利于组件的重用<BR></FONT>分层后更有利于组件的重用。如控制层可独立成一个能用的组件，视图层也可做成通用的操作界面。&nbsp;<BR><BR>不同JSP构造的应用<BR><STRONG><FONT size=3>为什么要组合使用servlet&nbsp;&amp;&nbsp;JSP?</FONT></STRONG><BR>&nbsp;&nbsp;&nbsp;&nbsp;典型的做法：使用JSP来简化HTML内容的开发与维护&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;对于简单的动态代码，使用由脚本元素调用JAVA代码来完成。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;对于稍微复杂一些的应用，则可使用脚本元素调用定制的类来完成。(即所谓的help类)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;对于比较复杂的应用，则使用JAVA&nbsp;BEAN和定制标签<BR>&nbsp;&nbsp;&nbsp;&nbsp;<FONT style="BACKGROUND-COLOR: #ffc0cb">但，这些是不够的&nbsp;：</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;对于复杂的处理过程，从JSP开始做起会难以处理。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;JSP除了能够带来将实际的代码隔离成单独的类、bean、和定制标签的便利以外，它所隐含的假定是单个页面给出单个基本视图。<BR><BR></FONT>
<H3><B><FONT size=3>对MVC的误解</FONT></B></H3><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;必须采用复杂的框架&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;框架有时很有用&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Struts&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;JavaServer&nbsp;Faces&nbsp;(JSF)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;但并非必需!&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;对于大多简单或者适度复杂的应用来说，使用内建的RequestDispatcher就能够很好地实现MVC<BR>&nbsp;&nbsp;&nbsp;&nbsp;MVC影响整个系统的设计&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;我们可以用MVC来处理单个请求&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;可以将它认为是MVC方案，而非MVC框架。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;也被称为是模型2方案<BR><BR></FONT>
<H3><B><FONT size=3>用RequestDispatcher实现MVC</FONT></B></H3><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;定义用以表示数据的java&nbsp;bean&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;使用一个servlet处理请求&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; servlet读取请求参数，检查数据的缺失或异常等。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;3.&nbsp;填充bean&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该servlet调用业务逻辑或数据访问代码得到最终的结果。得出的结果被放在第一步中定义的bean中。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;4.&nbsp;将bean存储在请求,会话或servlet的上下文中&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该servlet调用请求、会话或servlet上下文对象的setAttribute存储表达请求结果的bean的引用。<BR>&nbsp;&nbsp;&nbsp;&nbsp;5.&nbsp;将请求转发到JSP页面&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该servlet确定哪个JSP页面适合于处理当前的情形，并使用RequestDispatcher的forward方法将控制转移到那个页面。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;6.&nbsp;从bean中提取数据&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSP页面使用jsp:useBean和与第4步匹配的位置访问之前存储的bean，然后使用jsp:getProperty输出bean的属性。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSP页面并不创建或修改bean；它只是提取并显示由servlet创建的数据。<BR><BR><STRONG>jsp:useBean在MVC中的使用与在独立JSP页面中有什么不同<BR></STRONG>&nbsp;&nbsp;&nbsp;&nbsp;JSP页面不应该创建对象&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;应该由servlet创建所有的数据对象。因此，为了保证JSP页面不会创建对象，我们应该使用<?xml:namespace prefix = jsp /><jsp:useBean ... type=“package.Class” ></jsp:useBean ... type=“package.Class” ><BR>而不是<BR><jsp:useBean ... class="package.Class" ></jsp:useBean ... class="package.Class" ><BR>&nbsp;&nbsp;&nbsp;&nbsp;JSP页面也不应该修改已有的对象&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;因此，我们应该只使用jsp:getProperty，不使用jsp:setProperty。提示：jsp:useBean的scope选项<BR>&nbsp;&nbsp;&nbsp;&nbsp;request&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<jsp:useBean id="..." type="..." scope="request" ></jsp:useBean id="..." type="..." scope="request" ><BR>&nbsp;&nbsp;&nbsp;&nbsp;session&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<jsp:useBean id="..." type="..." scope="session" ></jsp:useBean id="..." type="..." scope="session" ><BR>&nbsp;&nbsp;&nbsp;&nbsp;application&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<jsp:useBean id=".." type=".." scope="application" ></jsp:useBean id=".." type=".." scope="application" ><BR>&nbsp;&nbsp;&nbsp;&nbsp;page&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<jsp:useBean id=“...” type=“...” scope=“page” ></jsp:useBean id=“...” type=“...” scope=“page” ><BR>或者仅仅使用<jsp:useBean id="..." type="..." ></jsp:useBean id="..." type="..." >&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;MVC&nbsp;(Model&nbsp;2)构架不使用这个scope。<BR><BR>不同数据共享方式<BR>&nbsp;&nbsp;&nbsp;&nbsp;向用户显示一个随机的数字。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;由于每次请求应该产生新的数字，因而基于请求的共享是恰当的。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;显示用户的姓和名&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;数据要为每个客户存储，因而基于会话的共享比较适用。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;显示一个指定长度的质数。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;数据在多个客户间共享，因此，基于应用的共享比较恰当。<BR><BR>基于请求的数据共享<BR>&nbsp;&nbsp;&nbsp;&nbsp;Servlet&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;ValueObject&nbsp;value&nbsp;=&nbsp;new&nbsp;ValueObject(...);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;request.setAttribute("key",&nbsp;value);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;RequestDispatcher&nbsp;dispatcher&nbsp;=&nbsp;<BR>request.getRequestDispatcher("/WEB-INF/SomePage.jsp");&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;dispatcher.forward(request,&nbsp;response);&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;JSP&nbsp;<BR></FONT><jsp:useBean id="key" type="somePackage.ValueObject" <BR><FONT size=2>scope="request"&nbsp;/&gt;&nbsp;<BR><jsp:getProperty name="key" property="someProperty" ></jsp:getProperty name="key" property="someProperty" ><BR><BR>基于会话的数据共享<BR>&nbsp;&nbsp;&nbsp;&nbsp;Servlet&nbsp;<BR>ValueObject&nbsp;value&nbsp;=&nbsp;new&nbsp;ValueObject(...);&nbsp;<BR>HttpSession&nbsp;session&nbsp;=&nbsp;request.getSession();&nbsp;<BR>session.setAttribute("key",&nbsp;value);&nbsp;<BR>RequestDispatcher&nbsp;dispatcher&nbsp;=&nbsp;<BR>request.getRequestDispatcher("/WEB-INF/SomePage.jsp");&nbsp;<BR>dispatcher.forward(request,&nbsp;response);&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;JSP&nbsp;<BR></FONT><jsp:useBean id="key" type="somePackage.ValueObject" <BR><FONT size=2>scope="session"&nbsp;/&gt;&nbsp;<BR><jsp:getProperty name="key" property="someProperty" ></jsp:getProperty name="key" property="someProperty" ><BR><BR>基于ServletContext的数据共享<BR>&nbsp;&nbsp;&nbsp;&nbsp;Servlet&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;synchronized(this)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ValueObject&nbsp;value&nbsp;=&nbsp;new&nbsp;ValueObject(...);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getServletContext().setAttribute("key",&nbsp;value);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RequestDispatcher&nbsp;dispatcher&nbsp;=&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.getRequestDispatcher("/WEB-INF/SomePage.jsp");&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dispatcher.forward(request,&nbsp;response);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;JSP&nbsp;<BR><jsp:useBean id="key" type="somePackage.ValueObject“ scope="application" ></jsp:useBean id="key" type="somePackage.ValueObject“ scope="application" >&nbsp;<BR><jsp:getProperty name="key" property="someProperty" ></jsp:getProperty name="key" property="someProperty" ><BR><BR>JSP页面中的相对URL<BR>&nbsp;&nbsp;&nbsp;&nbsp;问题：&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;使用请求分配器进行的转发对客户来说是透明的。初始的URL是浏览器惟一知道的URL。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;为什么这会比较重要？&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;浏览器会如何处理类似下面的这些标签：&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<IMG SRC="FOO.GIF" …>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<LINK REL=STYLESHEET <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HREF="JSP-Styles.css"&nbsp;TYPE="text/css"&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A HREF="BAR.JSP">…</A>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;答案：浏览器将会把它们看作是相对于servlet的URL&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;最简单的解决方案：&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;使用以斜杠开始的URL<BR><BR>Summary<BR>&nbsp;&nbsp;&nbsp;&nbsp;MVC&nbsp;(Model&nbsp;2)&nbsp;方式适用于：&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;单次提交会产生多个基本外观。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;几个页面拥有大量公共的处理过程。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;需要为同样的数据提供多个视图的应用程序,它很好地实现了数据层与表示层的分离，特别适用于开发与用户图形界面有关的应用程序&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;构架&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;由一个servlet应答初始的请求&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Servlet完成实际的数据处理并将结果存储在bean中&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Bean存储在HttpServletRequest,&nbsp;HttpSession,&nbsp;或ServletContext中&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Servlet使用RequestDispatcher的forward方法将请求转发到JSP页面&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;JSP页面通过使用jsp:useBean和相应的作用域(request,&nbsp;session,&nbsp;application)从bean中读出数<BR><BR></FONT></jsp:useBean id="key" type="somePackage.ValueObject" <BR></jsp:useBean id="key" type="somePackage.ValueObject" <BR><img src ="http://www.blogjava.net/vaga/aggbug/19043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vaga/" target="_blank">vaga</a> 2005-11-09 20:31 <a href="http://www.blogjava.net/vaga/articles/19043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[摘] JSF VS Tapestry 全面比较 （三）</title><link>http://www.blogjava.net/vaga/articles/19014.html</link><dc:creator>vaga</dc:creator><author>vaga</author><pubDate>Wed, 09 Nov 2005 09:14:00 GMT</pubDate><guid>http://www.blogjava.net/vaga/articles/19014.html</guid><wfw:comment>http://www.blogjava.net/vaga/comments/19014.html</wfw:comment><comments>http://www.blogjava.net/vaga/articles/19014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/vaga/comments/commentRss/19014.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vaga/services/trackbacks/19014.html</trackback:ping><description><![CDATA[<DT><FONT size=4>JSF VS Tapestry 全面比较（三） </FONT>
<DD class=ArticleInfo><FONT size=4>2005.11.09 </FONT>
<DD class=ArticleContent>
<P><STRONG><FONT size=4>比较2： java编程模型(Java Programming Model)</FONT></STRONG></P>
<P><FONT size=4>　　在前面我们提到Tapestry和JSF都允许表现层的模板直接和一个Java类中的属性和方法进行交互，那这些类的实例在运行时是怎么创建和管理的呢？<BR><BR>　　Tapestry<BR>　　Tapestry的一个完整过程通常都要包括三个部分：用于显示的页面模板(一般就是html)，带有相关属性和方法的java类，用于定义页面模板上的控制元素和java类的关系的页面定义文件。Tapestry有着一套特殊的访问HttpSess ion、ServletContext的体系。<BR>　　在一个页面定义文件中描述所有的数据绑定是可以的，但是一个页面控制元素却不能在request周期内，绑定一个java类。在request周期内只能通过一个page类访问一些属性和方法。这其中最主要的限制就是关于page类的问题，一个pag e类必须是BasePage或者AbstractPage的派生类。从另一方面来说，这就意味着你所编写的表现层逻辑的代码将会和框架本身的实现有着非常紧密的耦合。不过，Tapestry未来的版本就会减少这种耦合，努力成为一个松耦合的编程模型。<BR><BR>　　JSF<BR>　　在JSF应用中没有页面定义文件。它只有一个全局的配置文件，命名为：faces-config.xml，里面通常都定义了一堆"managed beans"。这些managed beans都是带有属性和事件监听器的定义良好的java bean。在faces-config.xml中定义的后端bean都有三个参数：一个标识符、一个java类名、一个bean的生存周期，生存周期可以是request、session、application中的一种。一旦在 faces-config.xml中定义好了一个managed bean,那一个前端页面上的显示控制元素就可以使用标识符来关联这个bean。managed bean也可以配置为引用另外一个managed bean。<BR><BR>　　JSF和Tapestry都可以方便的与其他的中间层技术整合，比如Spring。JSF managed bean facility是一个IoC（Inversion of Control）。通过诸如 JSF-Spring 这样的扩展技术，我们可以方便将其和Spring很好的整合在一起，使得JSF的表达式可以调用Spring的bean的方法。虽然Spring可以与 Tapestry3.0整合，但是在Tapestry4.0当中才能更好的充分发挥IoC特性；Tape stry的领导Howard Lewis Ship已经在Tapestry启动了IoC框架的工作。Spring的bean将会很轻松的注入到Tapestry应用的类中。<BR><BR>　　JSF的编程模型提供了更大的灵活型，因为你可以通过组合的方式来丰富你的代码功能。比如，你可以设定一个指定的managed bean完成页面的某些功能，同时，你也可以在这些bean里引用其他的managed bena,从而可在页面间共享一些功能。<BR><BR>而Tapestry必须使用类继承的方法，也就是说，Tapestry应用中的一个页面类必须从框架指定的基类中派生(包含一大堆框架指定的状态)，这并不是一个理想的方法。<BR><BR>JSF能够非常直观的管理session和application周期内的状态： 页面代码可以方便的访问managed bean，而不管其生命周期是request、session还是application。而Tapestry在这方面就相对差点，不过， Tapestry4.0在这方面做了很大的改进，引入了类似于JSF managed bean的技术，同时,还支持Java 5.0的annotaions技术，减少对XML配置文件的依赖，从而降低应用配置的复杂性。<BR><BR>　　</FONT><FONT color=#800080 size=4> JSF在编程模型上来看，与Tapestry相比具有更大的灵活性。<BR></FONT></P></DD><img src ="http://www.blogjava.net/vaga/aggbug/19014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vaga/" target="_blank">vaga</a> 2005-11-09 17:14 <a href="http://www.blogjava.net/vaga/articles/19014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[摘] JSF VS Tapestry 全面比较 （二）</title><link>http://www.blogjava.net/vaga/articles/19010.html</link><dc:creator>vaga</dc:creator><author>vaga</author><pubDate>Wed, 09 Nov 2005 08:56:00 GMT</pubDate><guid>http://www.blogjava.net/vaga/articles/19010.html</guid><wfw:comment>http://www.blogjava.net/vaga/comments/19010.html</wfw:comment><comments>http://www.blogjava.net/vaga/articles/19010.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/vaga/comments/commentRss/19010.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vaga/services/trackbacks/19010.html</trackback:ping><description><![CDATA[<DT><FONT size=4>JSF VS Tapestry 全面比较（二） </FONT>
<DD class=ArticleInfo><FONT size=4>2005.11.09 </FONT>
<DD class=ArticleContent>
<P><STRONG><FONT size=4>对比1： 页面开发(Page Development)</FONT></STRONG></P>
<P><FONT size=4>　　一个web应用实际上就是后端用java代码获取相应数据，并将数据传递给前端表现层代码，然后最终返回给终端用户。因此，在一个开发人员看来，当他初次接触JSF和Tapestry时，最直接的感觉就是JSF的表现层是基于JSP的模板技术，而Ta pestry的表现层模板基本就可以看作是一个HTML。 <BR><BR>　　JSF<BR>　　JSF采用JSP的技术作为其表现层技术。与标准兼容的JSF实现必须实现一个核心组件的JSP标签集。下面的代码就是一个使用了JSF组件标签的Html代码：</FONT></P>
<DIV>
<DIV><FONT size=4>代码:<BR></FONT><FONT size=3>&lt;h:form&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp; &lt;h:panelGrid columns="2" border = "1"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h:outputText styleClass = "label" value="No"/&gt;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h:outputText value="#{holidaySession.currentHolidayBooking.holidayID}"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h:outputText styleClass = "label" value="Date"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h:outputText value="#{holidaySession.currentHolidayBooking.date}"/&gt;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h:outputText styleClass = "label" value="Number of days"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h:outputText value="#{holidaySession.currentHolidayBooking.amount.value}"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h:outputText styleClass = "label" value="Description"/&gt;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h:outputText value="#{holidaySession.currentHolidayBooking.description}"/&gt;<BR> &lt;/h:panelGrid&gt;<BR> &lt;BR&gt;<BR> &lt;h:commandButton value="Back" action="#{holidaydetail_backing.home}" immediate = "true"/&gt;<BR><BR>&lt;/h:form&gt;<BR></FONT></DIV></DIV>
<P><FONT size=4>　　含有JSF标签的html页面不能在标准浏览器中预览。要想浏览，必须使用JSF设计工具或者直接部署到应用中，在真实运行环境中浏览。<BR>　　对于JSF技术来说，其表现层技术就是JSP，但是这不是唯一的解决方法。Hans Bergsten的文章介绍了可供选择的其他的方法，读者可阅读该文章获取详细信息，</FONT><A href="http://www.onjava.com/pub/a/onjava/2004/06/09/jsf.html" target=_blank><FONT color=#000066 size=4>Improving JSF by Dumping JSP</FONT></A><FONT size=4>。 Bergsten的文章中指出了混合JSF和JSP标签暴露出的一些问题。当然，这些问题在JSF1.2和JSP2.1中会得到解决。<BR><BR>　　Tapestry<BR>　　对于大多数的Tapestry应用来说，Tapestry的表现层模板看起来就是一个简单的规则的Html，只不过其中加入了一些Tapestry的属性。下面是一段例子代码：</FONT></P>
<DIV>
<DIV><FONT size=4>代码:</FONT></DIV><PRE><SPAN condition="ognl:currentHolidayBooking" jwcid="@Conditional">&lt;span jwcid = "@Conditional" condition = "ognl:currentHolidayBooking"&gt;  
        &lt;p&gt;&lt;strong&gt;Holiday Details&lt;/strong&gt;&lt;/p&gt;
        &lt;table&gt;
        &lt;tr&gt;
                &lt;td class = "label"&gt;No&lt;/td&gt;
                &lt;td&gt;&lt;span jwcid = "@Insert" 
                        value = "ognl:currentHolidayBooking.holidayID"&gt;1&lt;/span&gt;
                &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;                      
            &lt;td class = "label"&gt;Start date&lt;/td&gt;
                &lt;td&gt;&lt;span jwcid = "@Insert" 
                        value = "ognl:currentHolidayBooking.date" format = "ognl:dateFormat"&gt;1&lt;/span&gt;
                &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;                               
            &lt;td class = "label"&gt;Number of days&lt;/td&gt;
                &lt;td&gt;&lt;span jwcid = "@Insert" 
                        value = "ognl:currentHolidayBooking.amount.value"&gt;1&lt;/span&gt;
                &lt;/td&gt;
        &lt;/tr&gt; 
        &lt;tr&gt;               
            &lt;td class = "label"&gt;Description&lt;/td&gt;    
                &lt;td&gt;&lt;span jwcid = "@Insert" 
                        value = "ognl:currentHolidayBooking.description"&gt;1&lt;/span&gt;
                &lt;/td&gt;
        &lt;/tr&gt;
        &lt;/table&gt;
&lt;/span&gt;</SPAN></PRE></DIV>
<P><FONT size=4>　　大家可以尝试把这段代码放入一个Html的body标签当中，你会发现浏览器可以正常的观看它。<BR>　　上面的例子中，jwcid = "@componentName"属性就是定义了一个Tapestry标签。<BR>　　Tapestry的模板不仅仅可以用HTML作为载体，它也支持其他的一些标记语言，Tapestry标签是具有良好格式的标签，即必须成对出现。 Tapestry模板技术支持的标记语言典型的就是HTML以及用于无线应用的WML。其最大的一个特点 就是，可脱离Servlet容器，直接预览。<BR><BR>　　事实上JSF标签由于不是标准的html标签，使得它对于初学者来说，是难于使用的。而对于很多java程序员来说，他们喜欢编辑HTML代码，至少是乐意编写html代码。<BR><BR>　　JSF技术宣称的一个技术优点就是，可使用同一个模板编写运行在不同设备上的应用，由此带来很大的灵活性。然而，这样做，由于要协调不同设备间的表现差异性，那么很可能同一个模板，将不能正好表现你的输出。同时，你不得不学习新的标签库的使用方法，并且搞懂它们是怎样映射到html的。随着时间的推移，JSF标签的简洁可帮助你很快的编写表现层代码，同时也降低了开发者对jsf设计工具的依赖。<BR><BR>　　本文认为，JSF的学习成本高于其技术优点。在大多数情况下，我们并不需要编写适应于不同设备的应用。尽管JSF设计工具提供了简单的图形化的方法来构建和预览JSF应用，但是在一个开发中，页面设计人员更多的是喜欢用流行的HTML设计工具来编写和预览页面，这就发生了一个冲突，即只有将更多的页面工作转移到java程序员身上，因为一个页面设计人员通常情况下是不乐意去操作JSF设计工具的。<BR><BR>　　JSF开发者一直在寻找一种解决这些问题的方法。JSF技术设计良好的扩展体系，使得这成为可能，其中一个技术浮现出来，那就是表现层控制器。一个非常有前途的表现层控制器的实现就是Facelets,由java.net创建的开放源代码项目。Facelets的灵感就来源于Tapestry的模板模型，这使得JSF不再依赖于JSP技术。Facelets允许开发者创建Tapestry风格的标签，就像下面这段代码一样：</FONT></P>
<DIV>
<DIV><FONT size=4>代码:</FONT></DIV><PRE><FONT size=4>    </FONT><INPUT id=bar value=#{foo.bar} jsfc="h:inputText"></PRE></DIV>
<P><FONT size=4>　　在未来的一段时间内，Facelets将会被开发者所采用，或许会影响JSF未来的版本。<BR><BR>　　</FONT><FONT color=#800080 size=4>和JSF比较，Tapestry在表现层方面基于HTML代码,可被标准浏览器所浏览，这正是它在表现层上的优势所在。<BR></FONT></P></DD><img src ="http://www.blogjava.net/vaga/aggbug/19010.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vaga/" target="_blank">vaga</a> 2005-11-09 16:56 <a href="http://www.blogjava.net/vaga/articles/19010.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[摘] JSF VS Tapestry 全面比较 （一）</title><link>http://www.blogjava.net/vaga/articles/19009.html</link><dc:creator>vaga</dc:creator><author>vaga</author><pubDate>Wed, 09 Nov 2005 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/vaga/articles/19009.html</guid><wfw:comment>http://www.blogjava.net/vaga/comments/19009.html</wfw:comment><comments>http://www.blogjava.net/vaga/articles/19009.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/vaga/comments/commentRss/19009.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vaga/services/trackbacks/19009.html</trackback:ping><description><![CDATA[<DIV id=OutBox>
<DIV id=listMainArea>
<DIV id=listSimpleNav><FONT size=4>JSF VS Tapestry 全面比较（一） </FONT></DIV>
<DL class=ReadArticle>
<DD class=ArticleInfo><FONT size=4>2005.11.09 </FONT>
<DD class=ArticleContent>
<P><STRONG><FONT size=4>作者：<EM>&nbsp;&nbsp; by Phil Zoio</EM><BR>翻译：&nbsp;&nbsp; BlueCrystal<BR>来自：&nbsp;&nbsp; </FONT></STRONG><A href="http://www.theserverside.com/articles/article.tss?l=JSFTapestry" target=_blank><STRONG><FONT color=#000066 size=4>http://www.theserverside.com/articles/article.tss?l=JSFTapestry</FONT></STRONG></A></P>
<P><FONT size=4>　　目前应用很广泛而且也很成熟的Struts应用开发框架，在未来几年里将会逐渐淡出，其基于Action(action-based)的开发模型也将被活跃的java社区所推崇的新的开发模型所替代，对于java开源社区来说，追求完美是很多人的理想。在2000年初诞生的Struts以及其他类似的 MVC(Model View Controler)框架主要都是以操作为中心，且都是无状态的开发模型，而现在，基于组件(component-based)和事件驱动(event- driven)的开发模型逐渐流行起来，在很多时候都成了Struts的有利竞争者，这其中来自jcp的jsr127-JavaServer Faces(JSF)以及来自apache的Tapestry是其中的佼佼者。<BR><BR>　　在这篇文章中，我们将把这两种框架JSF和Tapestry进行详细的对比。我们的比较将涉及到两种框架的设计、运行环境以及如何开发。比较的目的在于让读者了解这两种框架各自的优缺点，以便于在自己的项目中，根据实际情况，选择合适的框架。该文章的内容基于JSF1.1和Tapestry3.0.3 (在个别地方由于需要会谈到Tapestry4.0)。<BR><BR><BR>　　JSF和Tapestry简介<BR>&nbsp;&nbsp; &nbsp;<BR>　　JSF源于JCP(Java Community Process)的JSR127规范。Sun公司自己同时也对该规范提供了一个实现，目前的版本是1.1，而且该项目的设计者之一正是Struts的作者 Craig McClanahan。另外一个JSF的实现，就是Apache的一个项目MyFaces。目前，几个主流的java开发工具厂商都在其java ide中提供了对jsf的支持，比如Sun、Oracle、IBM、Borland等，而且JSF的后续版本JSF1.2也将成为J2EE5.0的一个组成部分。<BR>&nbsp;&nbsp; &nbsp;<BR>　　Tapestry最初于2000年在SourceForge注册，来自于Apple WebObjects，随后，于2003年成为Apache的一个项目。与JSF不同的是，Tapestry并不是某一个jsr规范的实现，它仅仅是一个开源项目，当前版本是3.0.3。4.0版本预计也将在后面的一段时间内推出。<BR>　　JSF和Tapestry作为MVC框架，在一些基本特性上是非常类似的：<BR></FONT></P>
<UL>
<LI><FONT size=4>&nbsp;&nbsp;&nbsp; 它们都让开发者不再直接与Servlet API打交道，而是让开发者在一个更高的抽象层上思考问题； </FONT>
<LI><FONT size=4>&nbsp;&nbsp;&nbsp; 它们都将web页面上的显示元素绑定到一个java对象的某个属性上，这些属性可能是字符串、数字、日期或者其他类型，并且由该对象来维护其状态。用户在页面上的交互行为（比如用鼠标点击一个按钮或者链接）都直接映射为java类中的一个事件处理方法； </FONT>
<LI><FONT size=4>&nbsp;&nbsp;&nbsp; 两种框架都支持组件式的开发方式，并且开发的组件可被其他开发者重用。两种框架都自带一个标准组件库，提供web开发的常见通用功能。 </FONT></LI></UL>
<P><FONT size=4>　　在下面的章节里面，我们将会看见这两个框架在各自的实现方式上是有很大区别的。对于大多数程序员来说，基于两种框架做开发，将是非常不同的两种体验。</FONT></P>
<P><FONT size=4>　　<STRONG>Sidebar: 例子程序</STRONG><BR>　　在下面本文提供了一个例子程序，该程序的代码大部分都将在这片文章中做出详细的描述。这个程序主要就是一个管理个人假期的工具，它的主要功能包括：<BR>　　* 一个home界面， 列出所有登记的假期，包括假期开始时间、天数以及一下描述信息；<BR>　　* 一个detail界面，用于浏览某一登记假期的详细信息；<BR>　　* 一个new界面，用于添加一个假期信息。<BR><BR>　　下面这幅图展示了该程序的主体流程和功能：<BR><IMG onmouseover="if(this.alt) this.style.cursor='hand';" src="http://www.theserverside.com/articles/content/JSFTapestry/app.jpg" width=400 border=0><BR><BR>　　你可以从下列地址下载该程序基于不同框架的源代码：<BR>　　</FONT><A href="http://www.theserverside.com/articles/content/JSFTapestry/jsf.zip" target=_blank><FONT color=#000066 size=4>JSF version</FONT></A><BR><FONT size=4>　　</FONT><A href="http://www.theserverside.com/articles/content/JSFTapestry/tapestry.zip" target=_blank><FONT color=#000066 size=4>Tapestry version</FONT></A><BR></P></DD></DL></DIV></DIV><img src ="http://www.blogjava.net/vaga/aggbug/19009.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vaga/" target="_blank">vaga</a> 2005-11-09 16:54 <a href="http://www.blogjava.net/vaga/articles/19009.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>