现在多数host装的还是MySQL 4.0x 版本以下,如果升级到了4.1x 或者移动到使用4.1x 的主机上,估计会遇到一些问题。我在这上面遇到了两个问题。
一是数据导入。在phpMyAdmin内导入后,发现中文变成了乱码。搜索学习后,了解到需要设置数据库的collation (校勘),如果你的数据库是utf-8的,设置为utf8_general_ci就可以了。
二是,即使正确导入了,在phpMyAdmin里也能正确显示,但页面上显示的文章内容都是“???”,而模板里面的汉字都能正常显示。这让我头疼了很久。搜索到Windix’s Weblog上有对此的说明:
“从MySQL 4.1开始引入的多语言支持确实很棒,而且一些特性已经超过了其他的数据库系统。不过我在测试过程中发现使用适用于MySQL 4.1之前的PHP语句操作MySQL数据库会造成乱码,即使是设置过了表字符集也是如此。我读了一下新的MySQL在线手册中第十章‘Character Set Support’后终于找到了解决方法并测试通过。MySQL 4.1的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。当我们按照原来的方式通过PHP存取MySQL数据库时,就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:
SET NAMES ‘utf8′;”
但是我依旧不知道,如何,在何处让WordPress运行这个SQL语句。后来在阿修的部落格上查到办法:
“為著解決這個問題必須去修改wp-includes/wp-db.php內的資料連線設定。詳細的修改方式是這樣的:
$this->dbh = @mysql_connect($dbhost,$dbuser,$dbpassword);
//加上下面這行
$this->query(”SET NAMES ‘utf8′”);”
这样子终于能正常显示中文的WordPress了。虽然后来还是没用,但是觉得这个经验会对别人有用。记得有人用email和我讨论过这样子的中文显示问题,但是我那时哪里知道问题出在MySQL 4.1x上。
还有,4.1x的数据库不向下兼容,所以升级的时候要三思啊。
Servlet的演变:在常规的 JSP,Servlet,JavaBean三层结构中,JSP实现View的功能,Servlet实现Controller的功能,JavaBean实现Model的实现。
在Struts中,将常规情况下的Servlet拆分与ActionServlet、FormBean、ActionBean三个部分。ActionServlet配合Struts-config.xml,专职完成页面导航,而不再负责具体的数据获取与相应逻辑,这两部分功能由FormBean和ActionBean来完成。
Struts的核心是Controller,即ActionServlet,而ActionServlet的核心就是Struts-config.xml,Struts-config.xml集中了所有页面的导航定义。对于大型的WEB项目,通过此配置文件即可迅速把握其脉络,这不管是对于前期的开发,还是后期的维护或升级都是大有裨益的。掌握Struts-config.xml是掌握Struts的关键所在。
<struts-config>
<data-sources />
<form-beans >
<form-bean name="systemForm" type="com.gdglc.survey.form.SystemForm" />
<form-bean name="FindMemberForm" type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="findName" type="java.lang.String"/>
</form-bean>
</form-beans>
<global-exceptions />
<global-forwards>
<forward name="showMsg" path="/msg.jsp" />
</global-forwards>
<action-mappings>
<action
path="/list"
type="com.gdglc.survey.action.ListAction">
<forward name="list" path="/list.jsp"/>
</action>
<action
attribute="systemForm"
input="/admin/System_Base_List.jsp"
name="systemForm"
path="/systemBaseModify"
type="com.gdglc.survey.action.SystemAction"
scope="request"
validate="false">
</action>
</action-mappings>
<message-resources parameter="com.gdglc.application" />
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>
</struts-config>
每一个FormBean 都必须继承ActionForm类,FormBean是对页面请求的封装。即把HTTP request 封装在一个对象中,需要说明的一点就是多个HTTP request可以共用一个FormBean,便于维护和重用。
public
final class RegUserForm extends
ActionForm{
private String logname;
private String password;
private String email;
public RegUserForm(){
logname = null;
password = null;
email = null;
}
......
public void reset(ActionMapping mapping, HttpServletRequest request)
{
logname = null;
password = null;
email = null;
}
public ActionErrors validate(ActionMapping mapping,HttpServletRequest request)
{
ActionErrors errors=new ActionErrors();
if(this.password==null)
errors.add(ActionErrors.GLOBAL_ERROR,new ActionError("password is null!!"));
......
return errors;
}
}
FormBean的产生是为了提供数据给ActionBean,在ActionBean中可以取得FormBean中封装的数据,经相应的逻辑处理后,调用业务方法完成相应业务要求。
public
final class RegUserAction extends
Action
{
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
{
......
if(true)
return mapping.findForwad("list");
else {
ActionErrors errors=new ActionErrors();
errors.add(ActionErrors.GLOBAL_ERROR,new ActionError("...."));
this.saveErrors(request,errors);
return new ActionForward(mapping.getInput());
}
}
}
Struts优缺点
优点:
Struts跟Tomcat、Turbine等诸多Apache项目一样,是开源软件,这是它的一大优点。使开发者能更深入的了解其内部实现机制。
除此之外,
Struts的优点主要集中体现在两个方面:Taglib和页面导航。Taglib是Struts的标记库,灵活动用,能大大提高开发效率。另外,就目前国内的JSP开发者而言,除了使用JSP自带的常用标记外,很少开发自己的标记,或许Struts是一个很好的起点。
关于页面导航,我认为那将是今后的一个发展方向,事实上,这样做,使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。
缺点:
Taglib是Struts的一大优势,但对于初学者而言,却需要一个持续学习的过程,甚至还会打乱你网页编写的习惯,但是,当你习惯了它时,你会觉得它真的很棒。
Struts将MVC的Controller一分为三,在获得结构更加清晰的同时,也增加了系统的复杂度。
Struts从产生到现在还不到半年,但已逐步越来越多运用于商业软件。虽然它现在还有不少缺点,但它是一种非常优秀的J2EE MVC实现方式,如果你的系统准备采用J2EE MVC架构,那么,不妨考虑一下Struts。
Struts实施经验:
1)、基于Struts架构的项目开发,首先需要有一个很好的整体规划,整个系统中包括哪几个模块,每个模块各需要多少FormBean和ActionBean等,而且最好有专人负责Struts-config.xml的管理。开发基于Struts的项目的难点在于配置管理,尤其是对Struts-config.xml的管理。
2)、如果你的项目非常紧,并且项目组中又没有富有经验的Struts开发人员,建议不要冒然采用Struts。Struts的掌握需要一个过程,对于一个熟练的JSP程序员,自学大概需要半个月左右的时间。如果结合titls,则需要更长的时间。
3)、如果你在网页中大量运用taglib,那么你的美工将做出部分牺牲。当你结合Tiles,功能增强的同时,这种牺牲尤为明显。当然,你对功能和美观的取舍由你自己决定。
4)、Taglib是一个好东西,但灵活运用它却需要一个过程,如果你不想在Taglib上花太多的时间,那么只需理解与FORM有关的几个标记,其它的标记就放着吧,以后再看,先去研究ActionServlet和Struts-config.xml,你会觉得很有成就感。
5)、Struts是否只适合于大型项目呢?No!Struts适合于各种大小的项目,当然,对于大型项目,它所体现出来的优势更加明显。
http://www.chinaitlab.com/www/news/article_show.asp?id=33092
Resin使用简介
使用Resin开发Java Web项目时,需要建立自己的WebApp。这里不介绍Resin Cmp/Ejb的开发和使用,只介绍用Resin开发普通的jsp/java servlet项目。在这里还要谈到resin.conf的配置。Resin中的应用可以有2种方式发布:一是在Resin的目录下发布;二是打包成War发布。
1、在Resin的目录下发布
在resin.conf中查找<web-app>标签,该标签表示一个web应用。
标签中,id属性表示该应用的Web路径。如<web-app id=’/test’>,表示该应用在Web上访问的时候应该用http://hostname/test/来访问。app-dir属性表示该应用的实际路径。如<app-dir>d:/resin/doc/test</app-dir>表示该应用在d:/resin/doc/test目录下面。默认值为根下面的和id同名的目录。Resin可以配置3种error-page:404错误也就是文件找不到错误页;Exception违例页;不能连接java引擎页。他们分别可以这样子设置。
404文件找不到页
<web-app id='/app1'>
<error-page error-code='404' location='/file_not_found.jsp'/>
</web-app>
Exception 违例页
<web-app id='/foo'>
<error-page exception-type='java.lang.NullPointerException'
location='/nullpointer.jsp'/>
</web-app>
不能连接到srun Servlet引擎错误页
该页设置和应用无关,属于服务器的设置。
<http-server>
<error-page exception-type='connection'
location='/missing_file.html'/>
</http-server>
classpath的设置
参见下面的语句:
<classpath id='WEB-INF/classes' source='WEB-INF/src' compile='true'/>
id参数的值表示classpath中编译后的classpath的存放路径;source参数的值表示classpath中java源代码的存放路径;compile中的值可能是true或者false,表示是否由Resin的srun自动编译java源代码。Classpath的设置一般和javaBean或者Servlet的使用有关。id的值表示javaBean的编译好的包存放的根,source的值表示javaBean的java源代码存放的根。Servlet相同。
Servlet的设置
参见下面的语句:
<servlet-mapping url-pattern='*.xtp' servlet-name='xtp'/>
<servlet-mapping url-pattern='*.jsp' servlet-name='jsp'/>
<servlet-mapping url-pattern='/servlet/*' servlet-name='invoker'/>
一般就是指定那些需要通过srun的解析。比如在这里,把*.jsp改成*.jss,其他不变,那么只要在访问时遇到*.jss的文件就和原来遇到*.jsp一样处理。通过这个可以指定解析的引擎,如以下的配置:
<servlet-mapping url-pattern='*.xtp' servlet-name='com.caucho.jsp.XtpServlet'/>
在Servlet中,也可以指定servlet。如
<servlet servlet-name='hello' servlet-class='test.HelloWorld'/>
<servlet-mapping url-pattern='/hello.html' servlet-name='hello'/>
在servlet-mapping中有个重要的参数case-sensitive 如果在windows上,最好配置成false,忽略大小写,从而和windows的约定一致。
Session的配置
参见如下的配置语句:
<session-config>
<session-max>4096</session-max>
<session-timeout>30</session-timeout>
<enable-cookies>true</enable-cookies>
<enable-url-rewriting>true</enable-url-rewriting>
<file-store>WEB-INF/sessions</file-store>
</session-config>
session-max :最大 session数量
session-timeout :session过期时间,以分钟为单位。
是否允许cookie :指session是否采用cookies。如果采用cookies,浏览器必须支持session才能使用,发布时建议改成false。enable-url-rewriting和enable-cookies一般配合使用。如果enable-cookies是false,enable-url-rewriting应该设成true比较合适。
file-store :该配置指示服务器是否把session作为文件存放在服务器上。如果把该项注释掉,则在你的web-app目录下的WEB-Inf/sessions目录不保存序列化后的session对象。Session还有jdbc-store配置,对应着把session通过jdbc永久保存在数据库中。其实也就是会话变量的序列化后的保存和重新载入的物理实现。在这里session还支持了多服务器的设置问题,
通过tcp-store参数设置。由于涉及到负载平衡的问题,在这里不详细叙述,只简单写一个例子:
<http-server>
<http id='a' port='80'/>
<srun id='a' host='host-a' port='6802'/>
<http id='b' port='80'/>
<srun id='b' host='host-b' port='6802'/>
<host id=''>
<web-app id=''>
<session-config>
<tcp-store/>
<always-load-session/>
</session-config>
</web-app>
</host>
</http-server>
这个例子表示session是按照tcp ring的方式传递。
temp-dir 的设置
temp-dir指的是应用的临时目录。也就是在javax.servlet.context.tempdir中用到的目录。模认是应用目录下的WEB-INF/tmp目录。
以上的设置都可以在<web-app>标签对中设置,控制某个web应用的设置。
2、打包成War发布
以下是介绍对如何在resin下使用已经打包成War的java Web应用进行发布。
其实这个是最简单也是最清晰的良好方法。在j2ee中,所有的项目都打包成ear发布。其中,Web应用打包成war,ejb应用打包成jar。在resin中,这些都可以直接部署。这里我只对打包成war的Web应用的部署做介绍。
在resin.conf中,查找这个:<war-dir id='webapps'/>。他表示war文件应该被拷贝的路径。这里指的是相对于resin的安装路径,如以上的设置表示d:/resin/webapps。只要重新启动Resin就可以了。Resin会把该war自动解包到webapps目录下。你可以在command控制台或者stdout.log中看到类似于
[2002-04-27 09:56:21.680] initializing application http://haitaiserver:8080/rwtest 的语句。这个表示该Web应用是自动安装的。只要这个应用是符合j2ee标准的Web应用,应该不会有问题。通过如上显示的路径就可以访问到这个应用。如果你到d:/resin/webapps/rwtest中浏览,你会看到Resin已经为你生成了rwtest目录,下面是META-INF和WEB-INF还有你自己的JSP/servlet 文件和目录。是完全符合j2ee的结构的。你可以在rwtest目录下建立新的jsp/servlet,一样可以被编译和解析并运行的。在实际操作中,可以使用Jbuilder 或者 WebSphere等Ide工具进行集成调试和打包,非常的方便。
使用Resin进行java Web项目的开发和调试
这里篇幅有限,不可能讲太多,我只对实际中最有用的部分做介绍。
Resin中如果定义了错误页,则出错后最常见的一大串Exception不会被看到,直接跳转到错误页。所以建议开发中先不设置错误页。jsp错误中最常见的就是Nullpoint Exception,其次是名称的拼写错误。错误也可以在Resin安装目录下的log目录下的stderr.log中找到。通过对该log文件的分析可以看到很多有用的错误信息。
在调试jsp的时候,如果定义了compile为true,jsp先被翻译成Servlet的java文件,再被编译成class文件。可以在你自己的work目录中找到该文件。java的名称在Resin中是这样子定义的:原先的jsp文件名前加下划线,再加上_jsp这个字样。所以在java 应用中的命名不要以_jsp结尾,也不要出现中文名称等字符;其实名称以_jsp为开头也是不合法的。
关于java对多国语言的支持问题,在Resin中得到了很好的解决。以jsp为例,参考Resin自动生成的java Servlet文件。只要在任何的jsp文件的最开始处增加:
<%@page contentType="text/html;charset=gb2312" %>
中文问题就解决了。察看生成的Servlet源文件片断:
response.setContentType("text/html;charset=gb2312");
request.setCharacterEncoding("GB2312");
以上为设置字符集
private static byte []_jsp_string26;
private static byte []_jsp_string27;
_jsp_string26 = "/r/n</table>/r/n<table class=/"type/">/r/n<tr>/r/n <td>".getBytes("GB2312");
_jsp_string27 = "/r/n</td><td>/r/n</tr>/r/n<!--/r/n<tr>/r/n<td>/r/".getBytes("GB2312");
以上是对页面的显示的编码。其中,getBytes(“gb2312”)是静态编码,这是Resin为了解决某些环境下还是不能正常显示而设置的。在Resin的配置文件(/conf/resin.conf)中,可以通过设置<jsp precompile='true' static-encoding='false' recompile-on-error='true'/>中的static-encoding属性为true或者false,来控制是否静态编码。其实在Resin容器的内部,所有的字符都是按照iso-8859-1来处理的。iso-8859-1是一个大字符集,虽然中文的gb2312和8859在字的定义上有不同,但是编码是包容了gb2312的。按照解决多国语言的方法,在纯英文平台上用iso-8859-1处理内部编码,而把字符的显示推向客户端的机器。所以这样只要编码是正确的,
在页面上显示中文就不存在问题。Tomcat3.2不方便的地方是Tomcat对数据库的操作中文支持不好,需要手动在java Bean或者Servlet中硬编码。通过测试,在Resin中完全没有这个问题。Tomcat4.0解决了这个问题。不过个人习惯来讲还是觉得resin在配置方面方便一些。
在Resin中可以自动解决引入的jar。这个在使用特殊的类或者第三方提供的开发包非常有用。方法非常简单:只要把该jar或者是zip拷贝到Resin安装目录下的lib目录下面,重新启动Resin,就可以了。如db2用到的db2java.zip文件,只要轻松拷贝到d:/resin/lib中就可以了。
Resin提供了对Jbuilder的集成调试。可以到:
http://www.caucho.com/projects/jbuilder/resin-jbuilder.jar免费下载到resin的jbuilder的ide扩展包。然后,把该包该名成:resin-jbuilder.jar,拷贝到jbuilder6/lib/ext目录下。然后,把Resin2.1解包安装在jbuilder6/resin-2.1目录下,就可以了。打开任何的War项目,在project上点右键,选择properties,选择Servers标签。在原来的选择框上,就可以看到多了一项Resin2.1。这样子就可以象原来用tomcat一样调试jsp/servlet了,而且比Tomcat更方便。见图2:
图2
调试方法和用Tomcat调试一样。
其他问题
使用Resin可以和apache结合使用。也就是利用apache做http服务器,而Resin做srun服务器。可以参考resin/conf/samples目录下的apache.conf。主要就是把 app-dir 设成 /usr/local/apache/htdocs(也就是apache的root)。同时在apache 中的http.conf也做了相应的设置。Resin还提供了对该过程的自动安装程式,运行resin/bin/setup,你可以在弹处的对话框中选择apache,这样子就可以了。只要你曾经安装过apache,resin可以自己找到httpd.conf文件所在的路径。
使用命令行方式启动Resin,如果改动了Resin.conf,Resin会自己重新启动适应新的配置。这个很适合初期安装时使用。
Resin对数据库缓冲池的支持很好。在这里,它提供了DBPool对缓冲池做了封装。实际使用时,只要在resin.conf这样配置:
<dbpool.sql>
<id>ORCL</id>
<driver>oracle.jdbc.driver.OracleDriver</driver>
<url>jdbc:oracle:thin:@localhost:1521:SMTH</url>
<!-- <url>jdbc:oracle:oci8:@SMTH</url> -->
<user>scott</user>
<password>tiger</password>
<max-connections>5</max-connections>
</dbpool.sql>
然后,在你的jsp或者servlet中就可以这样子使用了:
先导入 com.caucho.sql.*包,然后如下直接得到连接:
Connection conn = DBPool.getPool("ORCL").getConnection();
个人建议不要如上使用连接池,还是按照ejb的方法用从Context中直接找到的DataSource对象中得到连接通用性比较好。代码也很简单:
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup(“jdbc/EmployeeDB”);
Connection conn = ds.getConnection();
在Resin中如下配置jdbc就可以了:
<resource-ref>
<res-ref-name> jdbc/EmployeeDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<init-param driver-name="com.caucho.jdbc.mysql.Driver"/>
<init-param url="jdbc:mysql_caucho://localhost:3306/test"/>
<init-param user="name"/>
<init-param password="password"/>
<init-param max-connections="20"/>
<init-param max-idle-time="30"/>
</resource-ref>
用Resin Web Server开发还是比较愉快的。只是没有像Weblogic 或者WebSphere那样子提供现成的管理控制台而已。但是从稳定性和方便性来讲,Resin个人认为比Tomcat要好很多。况且Resin还有提供了resin-cmp 和 resin-ejb,功能更强大。
目录
正则表达式介绍
匹配模式
字符子集
行结束符
分组和引用
Unicode支持
正则表达式语法参考
- 字符
- 逻辑操作符
- 向后引用
- 边界元字符
- 重复指示符
- 字符子集
- 预定义子集(元字符)
- 扩展子集(元字符)
- 扩展中文子集(元字符)
- POSIX字符子集(只适用于ASCII)
- Unicode块和分类
替换表达式
替换表达式
- 特殊字符
- 自定义替换表
匹配模式
匹配模式指得是正则表达式引擎将以何种模式匹配字符串。
模式名称
| 启用,禁用
| 缺省启用
| 说明
|
UNIX_LINES
| (?d)启用,(?-d)禁用
| 是
| 启用Unix行模式。 在此模式下,只有 '/n'被认为是行结束符。它会影响., ^, 和 $ 的行为。
|
CASE_INSENSITIVE
| (?i)启用,(?-i)禁用
| 否
| 启用忽略大小写模式。 缺省时,忽略大小写模式只会影响 ASCII字符的匹配。 而Unicode范围的忽略大小写匹配需要通过 UNICODE_CASE 标志与本标志联合使用。 启用此模式会影响匹配性能。
|
COMMENTS
| (?x)启用,(?-x)禁用
| 否
| 允许空格和注释出现在正则表达式中。 在此模式下,空格被忽略,以#开始的单行注释被忽略。
|
MULTILINE
| (?m)启用,(?-m)禁用
| 是
| 启用多行模式。 In multiline mode the expressions ^ and $ 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.
|
DOTALL
| (?s)启用,(?-s)禁用
| 否
| 让.可以匹配行结束符。 在此模式下,元字符.可以匹配行结束符。缺省不允许如此匹配。
|
UNICODE_CASE
| (?u)启用,(?-u)禁用
| 否
| Enables Unicode-aware case folding. When this flag is specified then case-insensitive matching, when enabled by the CASE_INSENSITIVE 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. 启用此模式会影响性能。
|
CANON_EQ
| (?c)启用,(?-c)禁用
| 否
| Enables canonical equivalence. When this flag is specified then two characters will be considered to match if, and only if, their full canonical decompositions match. The expression "a/u030A", for example, will match the string "?" when this flag is specified. By default, matching does not take canonical equivalence into account. 启用此模式会影响性能。
|
字符子集
字符子集可以含有别的字符子集,并且可以通过联合操作符(缺省)和交集操作符(&&)实现组合。联合操作符表示某个子集匹配它的子子集所匹配的任意字符。交集操作符表明某个字符子集只匹配它的子子集都匹配的字符。
字符子集所能够有的操作符的优先级如下,从高到低:
- 转义符/x
- 成组符 [...]
- 区间符 a-z
- 联合符 [a-e][i-u]
- 交集符 [a-z&&[aeiou]]
注意:在字符子集[]内部的语法根本不同于正则表达式其它部分中的语法。例如,在字符子集内部,正则表达式 . 失去了它原有的含义,而是成了一个匹配.的元字符。
行结束符
行结束符是一个或两个字符序列,用以表明输入字符序列中一行的结束。下面的字符被认为是行结束符:
- 一个换行符('/n')。
- 一个回车符加上一个换行符("/r/n")。
- 一个单独的回车符('/r')。
- 代表下一行的字符('/u0085')。
- 行分隔符('/u2028'),Unicode中被定义。
- 一个分段符('/u2029),Unicode中被定义。
如果 UNIX_LINES 模式被启用,则只有换行符被认为是行结束符。
如果 MULTILINE 模式被启用,。
分组和引用
字符分组以它们的左括号的出现顺序来排序。例如在表达式((A)(B(C))),有四个分组:
- ((A)(B(C)))
- (A)
- (B(C))
- (C)
第0组永远表示表达式本身。
分组采用这样的命名方式,是因为,在一次匹配过程中,正则表达式会被匹配多次。以前的匹配子序列有可能在将来被使用;或者在匹配结束时,程序有可能需要重新获得所有匹配的子字符序列。
对于正则表达式中的某个分组而言,永远只保留最后匹配的字符序列。如果对某个分组匹配尝试失败,则会保留上次匹配成功的字符序列。例如,对于正则表达式(a(b)?)+而言,字符序列"aba",将会让分组2匹配的字符序列为"b"。
以(?开始的分组,将不会计入分组数目,也不会被后续匹配所引用。
Unicode支持
本正则表达式匹配引擎的实现遵循了《
Unicode技术报告:Unicode正则表达式指南》,实现了该指南的第二层所需的功能,但是在细微处有一些简单语法修改。
Unicode块(Block)和分类(Category)通过/p和/P通配苻表示。/p{
prop}匹配含有
prop的输入序列,而/P{
prop}匹配不含有
prop的输入序列。Unicode块通过前缀
In表示,如/p{InMongolian}。Unicode分类通过可选的前缀Is表示,因此/p{L}和/p{IsL}都代表Unicode分类 letters。Unicode块和分类都可以在正则表达式子集外部和内部使用。
目前支持的Unicode块和分类是《
Unicode标准,第三版》中所指定的块和分类。 Unicode块名称在《
Unicode 字符数据库》的第14章被定义,文件名称叫
Blocks-3.txt,但是名称中的空格被去掉了。例如"Basic Latin"成了"BasicLatin"。无论是标准化的还是非标准化的分类,都在该标准的第88页的第4-5表中被全部定义。
与Perl 5正则表达式语法对比
[TBD]
正则表达式参考
字符
正则表达式字符串
| 匹配的字符串
|
X
| 字符X,包括 CJK ExtB 区汉字
|
//
| 反斜杠/
|
| /0n | 八进制0n代表的字符(0<=n<=7)
|
/0nn
| 八进制0nn代表的字符(0<=n<=7)
|
/0mnn
| 八进制0mnn代表的字符(0<=m<=3,0<=n<=7)
|
/xhh
| 十六进制 0xhh所代表的字符
|
/uhhhh
| 十六进制 0xhhhh所代表的字符。注意,目前尚不支持CJK ExtB区汉字。
|
/t
| 制表符('/u0009')
|
/n
| 换行('/u000A')
|
/r
| 回车('/u000D')
|
/a
| 响铃符('/u0007')
|
/e
| 取消符Escape('/001B')
|
/cx
| x所代表的控制字符
|
逻辑操作符
正则表达式字符串
| 匹配的字符串
|
XY
| X后面跟随Y
|
X|Y
| X或者Y
|
(X)
| X作为分组表达式
|
向后引用
边界元字符
边界字符
| 匹配的字符串
|
^
| 行首
|
$
| 行末
|
| /b | 字符边界
|
/B
| 非字符边界
|
/A
| 输入流的开始
|
/G
| 上次匹配的结束处
|
/Z
| 输入流的结束,或者是最后一个行结束符,参见行结束符。
|
/z
| 输入流的结束
|
重复指示符
正则表达式字符串
| 匹配的字符串
|
X?
| X重复一次,或者不重复
|
X*
| X重复0次或多次
|
X+
| X重复1次或多次
|
X{n}
| X重复n次,不多也不少。
|
X{n,}
| X至少重复n次
|
X{n,m}
| X至少重复n次,至多重复m次。
|
注:
X{n,m}、?、*、+方式可以联合使用。
字符子集
正则表达式字符串子集
| 匹配的字符串
| 组合方式
|
[abc]
| 字符a,b或c,包括 CJK ExtB 区汉字
| 简单子集
|
[^abc]
| 任意非a,b或c的字符。
| 排除
|
| [a-zA-Z] | 从a到z,或者A到Z,包含a,z,A,Z。
| 区间
|
[a-d[m-p]]
| 从a到d,或者m到p,等于[a-dm-p]。
| 联合
|
[a-z&&[def]]
| d,e或者f。
| 交集
|
[a-z&&[^bc]]
| 从a到z,除了b和c,等于[ad-z]
| 扣除
|
[a-z&&[^m-p]]
| 从a到z,并且不包括从m到p,等于[a-lq-z]
| 扣除
|
预定义子集(元字符)
边界字符
| 匹配的字符串
|
.
| 任意字符,可能匹配行结束符。
|
/d
| 数字[0-9]
|
| /D | 非数字[^0-9]
|
/s
| 空白符[ /t/n/x0B/f/r]
|
/S
| 非空白符[^/s]
|
/w
| 单词符,包含有字母和数字[a-zA-Z_0-9]
|
/W
| 非单词符,不包含有字母和数字。
|
扩展子集(元字符)
扩展中文子集(元字符)
名称
| 块名称(/p{InXXX})
| 简化通配符
| 标准Unicode块,或者汉字列表
|
任意双字节字符(汉字或全角符号)
| /p{InQuqnJiao}
| /E
| 任意由GBK表示的汉字,不包括GB18030扩展部分, 以及CJK ExtB区的汉字。
|
任意单字节字符
| /p{InFQuanJiao}
| /~E
| 任意单字节字符。
|
任意全角ASCII字符
| /p{InQJAscii}
| /H
| 标准HalfwidthandFullwidthForms块
|
任意收录在BIG5码集中的双字节字符
| /p{InBig5}
| /I
| Big5可编码双字节字符
|
| 匹配未收录在BIG5码集中的双字节字符 | /p{InFBig5}
| /~I
| 非Big5可编码双字节字符
|
匹配任意汉字(不包括符号)
| /p{InHanziOrCJKExtB}
| /X
| 任意汉字,包括GB18030扩展部分。
|
匹配任意汉字(不包括符号)
| /p{InHanzi}
| /M
| 任意汉字,不包括GB18030扩展部分。
|
匹配非汉字的双字节字符
| /p{InFHanzi}
| /~M
| 任意非汉字的双字节字符, 包括GB18030扩展部分。
|
地支字符
| /p{InDiZhi}
| /U
| 子丑寅卯辰巳午未申酉戌亥
|
匹配收录在GB码集中的双字节字符
| /p{InGB}
| /g
| 收录在GB码集中的双字节字符, 不包括GB18030扩展部分。
|
匹配非收录在GB码集中的双字节字符
| /p{InFGB}
| /~g
| 未收录在GB码集中的双字节字符, 不包括GB18030扩展部分。
|
匹配收录在GBK码集中的双字节字符
| /p{InGBK}
| /h
| 收录在GBK码集中的双字节字符, 不包括GB18030扩展部分。
|
匹配非收录在GBK码集中的双字节字符
| /p{InFGBK}
| /~h
| 未收录在GBK码集中的双字节字符, 不包括GB18030扩展部分。
|
大写希腊字母
| /p{InDaXila}
| /K
| ΑΒΓΔΕΖΗΘΙΚΛΜΝ ΞΟΠΡΣΤΥΦΧΨΩ
|
日文片假名
| /p{InPianJia}
| /j
| 标准Katakana块
|
日文平假名
| /p{InPingJia}
| /J
| 标准Hiragana块
|
小写希腊字母
| /p{InXiaoXila}
| /k
| αβγδεζηθικλμν ξοπρστυφχψω
|
数学符号
| /p{InMathe}
| /m
| ±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙ ∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴
|
中文数字
| /p{InCnDigit}
| /i
| 〇一二三四五六七八九十百千万亿兆吉京
|
大写中文数字
| /p{InDaCnDigit}
| /N
| 零壹贰叁肆伍陆柒捌玖拾佰仟萬亿兆吉京
|
全角标点符号
| /p{InQJBiaoDian}
| /o
| 、。·ˉˇ¨〃々—~‖…‘’“”〔〕 〈〉《》「」『』〖〗【】!"'(), -.:;<=>?[]{|}`﹉﹊﹋﹌﹍﹎﹏﹐﹑﹒﹔﹕﹖﹗﹙﹚ ﹛﹜﹝﹞︵︶︹︺︿﹀︽︾﹁﹂﹃﹄ ︻︼︷︸︱︳︴
|
小写俄文字母
| /p{InXiaoEWen}
| /l
| абвгдеёжзийклмн опрстуфхцчшщъыьэюя
|
大写俄文字母
| /p{InDaEWen}
| /R
| АБВГДЕЁЖЗИЙКЛМНО ПРСТУФХЦЧШЩЪЫЬЭЮЯ
|
中文序号
| /p{InCnSN}
| /q
| ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ 再加上Unicode标准EnclosedAlphanumerics块
|
天干字符
| /p{InTianGan}
| /T
| 甲乙丙丁戊己庚辛壬癸
|
竖排标点符号
| /p{InSPBiaoDian}
| /V
| ︵︶︹︺︿﹀︽︾﹁﹂﹃﹄︻︼︷︸︱︳︴
|
拼音字符
| /p{InPinyin}
| /y
| āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑńňɡ GBK -> 0xA8A1- 0xA8C0 只是Unicode标准LatinExtended-A块的一部分。
|
注音字符
| /p{InZhuyin}
| /Y
| 标准Bopomofo块
|
制表字符
| /p{InZhiBiao}
| /C
| 标准BoxDrawing块。 经检查发现 textpro 的算法含有部分非标 准Unicode制表符:“∟∣≒≦≧⊿═”。
|
POSIX字符子集(只适用于ASCII)
正则表达式字符串
| 匹配的字符串
|
/p{Lower}
| 小写字母[a-z]
|
/p{Upper}
| 大写字母[A-Z]
|
/p{ASCII}
| 所有的ASCII字符[/x00-/x7F]
|
/p{Alpha}
| 大小写字母[/p{Lower}/p{Upper}]
|
/p{Digit}
| 数字[0-9]
|
/p{Alnum}
| 字母数字符,包含大小写字母和数字[/p{Alpha}/p{Digit}]
|
/p{Punct}
| 标点符号,!"#$%&'()*+,-./:;<=>?@[/]^_`{|}~之一。
|
/p{Graph}
| 可显示字符[/p{Alnum}/p{Punct}]
|
/p{Print}
| 可打印字符[/p{Graph}]
|
/p{Blank}
| 空格或者制表符[ /t]
|
/p{Cntrl}
| 控制字符[/x00-/x1F/x7F
|
/p{XDigit}
| 十六进制数字[0-9a-fA-F]
|
/p{Space}
| 空白符[ /t/n/x0B/f/r]
|
Unicode块和分类
块
| 中文名称(摘自Word XP)
| 代码区域
|
BasicLatin
| 基本拉丁语
| /u0000-/u007F
|
Latin-1Supplement
| 拉丁语-1
| /u0080-/u00FF
|
LatinExtended-A
| 拉丁语扩充-A
| /u0100-/u017F
|
LatinExtended-Bound
| 拉丁语扩充-B
| /u0180-/u024F
|
IPAExtensions
| 国际音标扩充
| /u0250-/u02AF
|
SpacingModifierLetters
| 进格的修饰字符
| /u02B0-/u02FF
|
CombiningDiacriticalMarks
| 组合用发音符
| /u0300-/u036F
|
Greek
| 基本希腊语
| /u0370-/u03FF
|
Cyrillic
| 西里尔语
| /u0400-/u04FF
|
Armenian
|
| /u0530-/u058F
|
Hebrew
|
| /u0590-/u05FF
|
Arabic
|
| /u0600-/u06FF
|
Syriac
|
| /u0700-/u074F
|
Thaana
|
| /u0780-/u07BF
|
Devanagari
|
| /u0900-/u097F
|
Bengali
|
| /u0980-/u09FF
|
Gurmukhi
|
| /u0A00-/u0A7F
|
Gujarati
|
| /u0A80-/u0AFF
|
Oriya
|
| /u0B00-/u0B7F
|
Tamil
|
| /u0B80-/u0BFF
|
Telugu
|
| /u0C00-/u0C7F
|
Kannada
|
| /u0C80-/u0CFF
|
Malayalam
|
| /u0D00-/u0D7F
|
Sinhala
|
| /u0D800-/uDFF
|
Thai
|
| /u0E00-/u0E7F
|
Lao
|
| /u0E80-/u0EFF
|
Tibetan
| 藏语
| /u0F00-/u0FFF
|
Myanmar
|
| /u1000-/u109F
|
Georgian
|
| /u10A0-/u10FF
|
HangulJamo
|
| /u1100-/u11FF
|
Ethiopic
|
| /u1200-/u137F
|
Cherokee
|
| /u13A0-/u13FF
|
UnifiedCanadianAboriginalSyllabics
|
| /u1400-/u167F
|
Ogham
|
| /u1680-/u169F
|
Runic
|
| /u16A0-/u16FF
|
Khmer
|
| /u1780-/u17FF
|
Mongolian
| 蒙古语
| /u1800-/u18AF
|
LatinExtendedAdditional
|
| /u1E00-/u1EFF
|
GreekExtended
|
| /u1F00-/u1FFF
|
GeneralPunctuation
| 广义标点
| /u2000-/u206F
|
SuperscriptsandSubscripts
|
| /u2070-/u209F
|
CurrencySymbols
| 货币符号
| /u20A0-/u20CF
|
CombiningMarksforSymbols
|
| /u20D0-/u20FF
|
LetterlikeSymbols
| 类似字母的符号
| /u2100-/u214F
|
NumberForms
| 数字形式
| /u2150-/u218F
|
Arrows
| 箭头
| /u2190-/u21FF
|
MathematicalOperators
| 数学运算符
| /u2200-/u22FF
|
MiscellaneousTechnical
| 零杂技术用符号
| /u2300-/u23FF
|
ControlPictures
|
| /u2400-/u243F
|
OpticalCharacterRecognition
|
| /u2440-/u245F
|
EnclosedAlphanumerics
| 带括号的字母数字
| /u2460-/u24FF
|
BoxDrawing
| 制表符
| /u2500-/u257F
|
BlockElements
| 方块图形
| /u2580-/u259F
|
GeometricShapes
| 几何图形
| /u25A0-/u25FF
|
MiscellaneousSymbols
| 零杂丁贝符(示意符等)
| /u2600-/u26FF
|
Dingbats
|
| /u2700-/u27BF
|
BraillePatterns
|
| /u2800-/u28FF
|
CJKRadicalsSupplement
|
| /u2E80-/u2EFF
|
KangxiRadicals
|
| /u2F00-/u2FDF
|
IdeographicDescriptionCharacters
|
| /u2FF0-/u2FFF
|
CJKSymbolsandPunctuation
| CJK符号和标点
| /u3000-/u303F
|
Hiragana
| 平假名
| /u3040-/u309F
|
Katakana
| 片假名
| /u30A0-/u30FF
|
Bopomofo
| 注音
| /u3100-/u312F
|
HangulCompatibilityJamo
|
| /u3130-/u318F
|
Kanbun
|
| /u3190-/u319F
|
BopomofoExtended
| 扩展注音
| /u31A0-/u31BF
|
EnclosedCJKLettersandMonths
| 带括号的CJK字母及月份
| /u3200-/u32FF
|
CJKCompatibility
| CJK兼容字符
| /u3300-/u33FF
|
CJKUnifiedIdeographsExtensionA
| CJK统一汉字扩展-A
| /u3400-/u4dBF
|
CJKUnifiedIdeographs
| CJK统一汉字
| /u4E00-/u9fAF
|
YiSyllables
|
| /uA000-/uA48F
|
YiRadicals
|
| /uA490-/uA4CF
|
HangulSyllables
|
| /uAC00-/uD7A3
|
HighSurrogates
|
| /uD800-/uDB7F
|
HighPrivateUseSurrogates
|
| /uDB80-/uDBFF
|
LowSurrogates
|
| /uDC00-/uDFFF
|
PrivateUse
| 专用区
| /uE000-/uF8FF
|
CJKCompatibilityIdeographs
| CJK兼容汉字
| /uF900-/uFAFF
|
AlphabeticPresentationForms
|
| /uFB00-/uFB4F
|
ArabicPresentationForms-A
|
| /uFB50-/uFDFF
|
CombiningHalfMarks
|
| /uFE20-/uFE2F
|
CJKCompatibilityForms
| CJK兼容形式
| /uFE30-/uFE4F
|
SmallFormVariants
| 小写变体
| /uFE50-/uFE6F
|
ArabicPresentationForms-Bound
|
| /uFE70-/ufeFF
|
Specials
|
| /uFFF0-/uFFFF
|
HalfwidthandFullwidthForms
| 半形及全形字符
| /uFF00-/uFFEF
|
分类
| 全称
| 说明
|
Cn
|
| UNASSIGNED
|
Lu
|
| UPPERCASE_LETTER
|
Ll
|
| LOWERCASE_LETTER
|
Lt
|
| TITLECASE_LETTER
|
Lm
|
| MODIFIER_LETTER
|
Lo
|
| OTHER_LETTER
|
Mn
|
| NON_SPACING_MARK
|
Me
|
| ENCLOSING_MARK
|
Mc
|
| COMBINING_SPACING_MARK
|
Nd
|
| DECIMAL_DIGIT_NUMBER
|
Nl
|
| LETTER_NUMBER
|
No
|
| OTHER_NUMBER
|
Zs
|
| SPACE_SEPARATOR
|
Zl
|
| LINE_SEPARATOR
|
Zp
|
| PARAGRAPH_SEPARATOR
|
Cc
|
| CNTRL
|
Cf
|
| FORMAT
|
Co
|
| PRIVATE_USE
|
Cs
|
| SURROGATE
|
Pd
|
| DASH_PUNCTUATION
|
Ps
|
| START_PUNCTUATION
|
Pe
|
| END_PUNCTUATION
|
Pc
|
| CONNECTOR_PUNCTUATION
|
Po
|
| OTHER_PUNCTUATION
|
Sm
|
| MATH_SYMBOL
|
Sc
|
| CURRENCY_SYMBOL
|
Sk
|
| MODIFIER_SYMBOL
|
So
|
| OTHER_SYMBOL
|
L
|
| LETTER
|
M
|
| MARK
|
N
|
| NUMBER
|
Z
|
| SEPARATOR
|
C
|
| CONTROL
|
P
|
| PUNCTUATION
|
S
|
| SYMBOL |
LD
|
| LETTER_OR_DIGIT
|
L1
|
| Latin-1
|
all
|
| ALL
|
ASCII
|
| ASCII
|
Alnum
|
| 字母数字(0-9,a-z,A-Z)
|
Alpha
|
| 字母(a-z,A-Z)
|
Blank
|
| 空格和制表符(' '|/t)
|
Cntrl
|
| 控制字符,不可打印
|
Digit
|
| 数字(0-9)
|
Graph
|
| 可打印且可视字母(例如空格' '是可打印的但不是可视字母,而 `a' 两者都是。)
|
Lower
|
| 小写字母
|
Print
|
| 可打印字母(非控制字符)
|
Punct
|
| 标符号(字母、数字、控制、空白符以外的字母),如:!@#$%}{<>,./?[]等等。
|
Space
|
| 空白符(' ',/t,0x09,0x0A,0x0B,0x0C,0x0D,0x20)
|
Upper
|
| 大写字母
|
XDigit
|
| 十六进制数字(0-9,a-f, A-F)
|
替换表达式
特殊字符
特殊字符介绍
| 描述
|
/n
| 换行
|
/b
| 向前删除一个字符。当这个字符位于替换串之首时,将删除匹配串之前的一个字符。若匹配串位于行首,将使匹配串所在行与前一行相合并。
|
/d
| 向后删除一个字符。当这个字符位于替换串之末时,将删除匹配串之后的一个字符。若匹配串位于行末,将使匹配串所在行与下一行相合并。
|
/e
| 插入一个ESC字符
|
/t
| 插入一个TAB字符
|
/n
| n代表查找正则表达式中的子表达式(组)。/1代表第一个子表达式,/2代表第二个子表达式,依次类推。/0代表整个匹配到的字符串。
|
/v
| 大写下一个字母
|
/U
| 全部大写以后的字母,直到碰到其它指示符为止。
|
/l
| 小写下一个字母
|
/L
| 全部小写以后的字母,直到碰到其它指示符为止。
|
/E
| 取消所有的字母大小写指示符。
|
自定义替换表
在查找/替换中使用自定义替换表
有的时候,上述简单的自定义替换功能是不够的。例如,用户可能希望只把出现在括号内的源串替换为目标串。这种文本处理可以通过在查找/替换中使用自定义替换表来解决。
在查找/替换功能中使用自定义替换表的替换函数是/Tn,其中n是0-9的数字, 注意n为0表示第10张替换表。如果略去n,其效果相当于/T1,即使用第一张替换表。例如要把所有放在方括号中的汉字替换为拼音,可以查找“/[(/E)/]”,替换为“/T{/1}”。即把第一个子表达式的匹配内容按自定义替换表转换。注意,如果/T函数的参数不在替换表的源串中,/T函数的结果与源串相同,即不做任何变换。
有些情况下,用户可能希望只使用替换表的一部分内容。还是以拼音为例,前面给出的替换表中包含了拼音的音调,如果在替换时不希望加上这些音调数字,可以使用“过滤”功能。所谓过滤,其实是用一个正则表达式去分析替换表的目标串,并把其中的某个子表达式取出来。
使用“过滤”时,在“设置自定义替换表”对话框中,点“过滤”按钮,在弹出的对话框中填入一个正则表达式。再以拼音为例,表达式可以写为“(/p{Alpha}+)(/d)”,其中第一对括号中的是不含音调的拼音,第二对括号是音调。在调用/T函数时,JTextPro会在目标串中查找这个正则表达式。但是如何把其中的子表达式取出来呢?/T函数还有一个可选的下标,取第n个子表达式的值就写作/T{...}[n]。所以,把放在方括号中的汉字替换为不带调的拼音,可以查找“/[(/E)/]”,替换为“/T{/1}[1]”