- 浏览: 520109 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (422)
- 重要 (12)
- BUG解决备忘录 (32)
- 环境搭建 (17)
- 开源组件 (4)
- 数据库 (16)
- 设计模式 (4)
- 测试 (3)
- javascript (5)
- Android (14)
- jdk相关 (9)
- struts2 (10)
- freemark (3)
- 自定义扩展及工具类 (5)
- jdk5新特性及java基础 (13)
- ssh及其他框架 (15)
- linux (32)
- tcp-ip http协议 (8)
- 服务器集群与负载均衡 (34)
- 项目管理相关 (11)
- 实用小技术 (10)
- 架构相关 (14)
- firefox组件 (11)
- spider (6)
- 产品设计 (11)
- PHP (1)
- ws (4)
- lucene (10)
- 其他 (2)
- BI (1)
- NoSQL (3)
- gzip (1)
- ext (4)
- db (6)
- socket (1)
- 源码阅读 (2)
- NIO (2)
- 图片处理 (1)
- java 环境 (2)
- 项目管理 (4)
- 从程序员到项目经理(一):没有捷径 (1)
- bug (1)
- JAVA BASE (8)
- 技术原理 (0)
- 新框架新技术 (1)
- 量化与python (1)
- 系统编程 (0)
- C语言 (0)
- 汇编 (0)
- 算法 (0)
最新评论
-
hyspace:
别逗了,最后一个算法根本不是最优的,sort(function ...
数组去重——一道前端校招试题 -
washingtin:
楼主能把策略和路由的类代码贴出来吗
Spring + iBatis 的多库横向切分简易解决思路 -
sdyjmc:
初略看了一下,没有闹明白啊,均衡负载使用Nginx,sessi ...
J2EE集群原理 I -
shandeai520:
谢谢大神!请教大神一个问题:假如我有三台服务器,连接池的上限是 ...
集群和数据库负载均衡的研究 -
hekuilove:
给lz推荐一下apache commonsStringUtil ...
request 获取 ip
Jakarta-ORO是最全面以及优化得最好的正则表达式API之一,Jakarta-ORO库以前叫做OROMatcher,是由Daniel F. Savarese编写,后来他赠给Jakarta Project。
Jakarta-ORO正则表达式库支持Perl5兼容的正则表达式语法。
环境 jdk1.5.0_12, jakarta-oro-2.0.8
查找:
- public static void simpleContains() throws Exception {
- Pattern pattern = new Perl5Compiler().compile( "\\d+" );
- Perl5Matcher matcher = new Perl5Matcher();
- PatternMatcherInput matcherInput = new PatternMatcherInput( "北京2008年8月08日20时" );
- while (matcher.contains(matcherInput, pattern)) {
- MatchResult result = matcher.getMatch();
- System.out.println(result.toString());
- }
- }
public static void simpleContains() throws Exception { Pattern pattern = new Perl5Compiler().compile("\\d+"); Perl5Matcher matcher = new Perl5Matcher(); PatternMatcherInput matcherInput = new PatternMatcherInput("北京2008年8月08日20时"); while (matcher.contains(matcherInput, pattern)) { MatchResult result = matcher.getMatch(); System.out.println(result.toString()); } }
输出:
2008
8
08
20
分组:
- public static void simpleResults() throws Exception {
- Pattern pattern = new Perl5Compiler().compile( "(\\d+\\.\\d+\\.\\d+\\.\\d+)@(\\d{2}/\\d{2}/\\d{4})" );
- Perl5Matcher matcher = new Perl5Matcher();
- PatternMatcherInput matcherInput = new PatternMatcherInput( "202.108.9.38@08/10/2008" );
- while (matcher.contains(matcherInput, pattern)) {
- MatchResult result = matcher.getMatch();
- for ( int i = 0 ; i < result.groups(); i++) {
- System.out.printf("%s : %s\n" , i, result.group(i));
- }
- }
- }
public static void simpleResults() throws Exception { Pattern pattern = new Perl5Compiler().compile("(\\d+\\.\\d+\\.\\d+\\.\\d+)@(\\d{2}/\\d{2}/\\d{4})"); Perl5Matcher matcher = new Perl5Matcher(); PatternMatcherInput matcherInput = new PatternMatcherInput("202.108.9.38@08/10/2008"); while (matcher.contains(matcherInput, pattern)) { MatchResult result = matcher.getMatch(); for(int i = 0; i < result.groups(); i++) { System.out.printf("%s : %s\n", i, result.group(i)); } } }
输出:
0 : 202.108.9.38@08/10/2008
1 : 202.108.9.38
2 : 08/10/2008
拆分:
- public static void spiltIt() throws Exception {
- String rawStr = "北京;朝阳;鸟巢奥运会场" ;
- ArrayList<String> results = new ArrayList<String>();
- Perl5Matcher matcher = new Perl5Matcher();
- Pattern pattern = new Perl5Compiler().compile( ";" );
- Util.split(results, matcher, pattern, rawStr);
- for (String r : results) {
- System.out.println(r);
- }
- }
public static void spiltIt() throws Exception { String rawStr = "北京;朝阳;鸟巢奥运会场"; ArrayList<String> results = new ArrayList<String>(); Perl5Matcher matcher = new Perl5Matcher(); Pattern pattern = new Perl5Compiler().compile(";"); Util.split(results, matcher, pattern, rawStr); for (String r : results) { System.out.println(r); } }
输出:
北京
朝阳
鸟巢奥运会场
替换:
- public static void substituteIt() throws Exception {
- String rawStr = "2008-08-11 17:16:32" ;
- Perl5Matcher matcher = new Perl5Matcher();
- Pattern pattern = new Perl5Compiler().compile( "-" );
- String result = Util.substitute(matcher, pattern, new Perl5Substitution( "," ), rawStr, Util.SUBSTITUTE_ALL);
- System.out.println(result);
- }
public static void substituteIt() throws Exception { String rawStr = "2008-08-11 17:16:32"; Perl5Matcher matcher = new Perl5Matcher(); Pattern pattern = new Perl5Compiler().compile("-"); String result = Util.substitute(matcher, pattern, new Perl5Substitution(","), rawStr, Util.SUBSTITUTE_ALL); System.out.println(result); }
输出:
2008,08,11 17:16:32
替换2:
- public static void substituteIt2() throws Exception {
- String rawStr = "2008-08-11 17:16:32" ;
- Perl5Matcher matcher = new Perl5Matcher();
- Pattern pattern = new Perl5Compiler().compile( "(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}:\\d{2}:\\d{2})" );
- String result = Util.substitute(matcher, pattern, new Perl5Substitution( "变换 $3,$2,$1 $4" ), rawStr, Util.SUBSTITUTE_ALL);
- System.out.println("格式yyyy-MM-dd HH:mm:ss到dd,MM,yyyy HH:mm:ss" );
- System.out.println(result);
- }
public static void substituteIt2() throws Exception { String rawStr = "2008-08-11 17:16:32"; Perl5Matcher matcher = new Perl5Matcher(); Pattern pattern = new Perl5Compiler().compile("(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}:\\d{2}:\\d{2})"); String result = Util.substitute(matcher, pattern, new Perl5Substitution("变换 $3,$2,$1 $4"), rawStr, Util.SUBSTITUTE_ALL); System.out.println("格式yyyy-MM-dd HH:mm:ss到dd,MM,yyyy HH:mm:ss"); System.out.println(result); }
输出:
格式yyyy-MM-dd HH:mm:ss到dd,MM,yyyy HH:mm:ss
变换 11,08,2008 17:16:32
小结:
上面的几种用法看起来要比java.util.regex包用着要复杂,如果是简单应用的话还是用自带的包省力。
下面几种用法是Perl5格式用法,如果习惯这种格式,用起来还是比较爽的。
Perl5Util查找格式:
[ m ] / pattern / [ i ][ m ][ s ][ x ]
第一个m写不写都可以(The m prefix is optional)
i 忽略大小写(case insensitive match)
m 多行模式(treat the input as consisting of multiple lines)
s 单行模式(treat the input as consisting of a single line)
x 使用扩展语法 (enable extended expression syntax)
查找 MyDoc/Java/SimpleJava 时
正常写法 "m/MyDoc\\/Java\\/SimpleJava/"
扩展写法 "m#MyDoc/Java/SimpleJava#x"
Perl5Util查找:
- public static void perl5Match() {
- Perl5Util plUtil = new Perl5Util();
- PatternMatcherInput matcherInput = new PatternMatcherInput( "北京2008年8月08日20时" );
- while (plUtil.match( "/\\d+/" , matcherInput)) {
- MatchResult result = plUtil.getMatch();
- System.out.println(result.toString());
- }
- }
public static void perl5Match() { Perl5Util plUtil = new Perl5Util(); PatternMatcherInput matcherInput = new PatternMatcherInput("北京2008年8月08日20时"); while (plUtil.match("/\\d+/", matcherInput)) { MatchResult result = plUtil.getMatch(); System.out.println(result.toString()); } }
输出:
2008
8
08
20
分组:
- public static void perl5Match2() {
- Perl5Util plUtil = new Perl5Util();
- PatternMatcherInput matcherInput = new PatternMatcherInput( "202.108.9.38@08/10/2008" );
- while (plUtil.match( "m#08(/10/)2008#x" , matcherInput)) {
- MatchResult result = plUtil.getMatch();
- System.out.printf("%s : %s\n" , 0 , result.group( 0 ));
- System.out.printf("%s : %s\n" , 1 , result.group( 1 ));
- }
- }
public static void perl5Match2() { Perl5Util plUtil = new Perl5Util(); PatternMatcherInput matcherInput = new PatternMatcherInput("202.108.9.38@08/10/2008"); while (plUtil.match("m#08(/10/)2008#x", matcherInput)) { MatchResult result = plUtil.getMatch(); System.out.printf("%s : %s\n", 0, result.group(0)); System.out.printf("%s : %s\n", 1, result.group(1)); } }
输出:
0 : 08/10/2008
1 : /10/
Perl5Util替换格式:
s / pattern / replacement / [ g ][ i ][ m ][ o ][ s ][ x ]
第一个s必须要写(The s prefix is mandatory)
g 全部替换。默认只替换第一个
i 忽略大小写(case insensitive match)
m 多行模式(treat the input as consisting of multiple lines)
o 只替换第一个(吾不确认)
s 单行模式(treat the input as consisting of a single line)
x 使用扩展语法 (enable extended expression syntax)
Perl5Util替换:
- public static void perl5Substitute() throws Exception {
- String rawStr = "2008-08-11 17:16:32" ;
- Perl5Util plutil = new Perl5Util();
- String result = plutil.substitute("s/-/,/g" , rawStr);
- System.out.println(result);
- }
public static void perl5Substitute() throws Exception { String rawStr = "2008-08-11 17:16:32"; Perl5Util plutil = new Perl5Util(); String result = plutil.substitute("s/-/,/g", rawStr); System.out.println(result); }
输出:
2008,08,11 17:16:32
Perl5Util替换2:
- public static void perl5Substitute2() throws Exception {
- String rawStr = "2008-08-11 17:16:32" ;
- Perl5Util plutil = new Perl5Util();
- String result = plutil.substitute("s/(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}:\\d{2}:\\d{2})/变换 $3,$2,$1 $4/g" , rawStr);
- System.out.println("格式yyyy-MM-dd HH:mm:ss到dd,MM,yyyy HH:mm:ss" );
- System.out.println(result);
- }
public static void perl5Substitute2() throws Exception { String rawStr = "2008-08-11 17:16:32"; Perl5Util plutil = new Perl5Util(); String result = plutil.substitute("s/(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}:\\d{2}:\\d{2})/变换 $3,$2,$1 $4/g", rawStr); System.out.println("格式yyyy-MM-dd HH:mm:ss到dd,MM,yyyy HH:mm:ss"); System.out.println(result); }
输出:
格式yyyy-MM-dd HH:mm:ss到dd,MM,yyyy HH:mm:ss
变换 11,08,2008 17:16:32
Perl5Util替换3:
- public static void perl5AddCommas() throws Exception {
- String rawStr = "314159265" ;
- Perl5Util plutil = new Perl5Util();
- while (plutil.match( "/[+-]?\\d*\\d{4}/" , rawStr)){
- rawStr = plutil.substitute("s/([+-]?\\d*\\d)(\\d{3})/$1,$2/" , rawStr);
- System.out.println(rawStr);
- }
- System.out.println(rawStr);
- }
public static void perl5AddCommas() throws Exception { String rawStr = "314159265"; Perl5Util plutil = new Perl5Util(); while(plutil.match("/[+-]?\\d*\\d{4}/", rawStr)){ rawStr = plutil.substitute("s/([+-]?\\d*\\d)(\\d{3})/$1,$2/", rawStr); System.out.println(rawStr); } System.out.println(rawStr); }
输出:
314159,265
314,159,265
314,159,265
过滤:
- public static void filter() {
- String path = "D:\\MyDoc\\Java\\SimpleJava" ;
- File file = new File(path);
- String[] globList = file.list(new GlobFilenameFilter( "*.java" ));
- for (String fn : globList) {
- System.out.println(fn);
- }
- String[] perl5List = file.list(new Perl5FilenameFilter( ".+\\.java" ));
- for (String fn : perl5List) {
- System.out.println(fn);
- }
- }
public static void filter() { String path = "D:\\MyDoc\\Java\\SimpleJava"; File file = new File(path); String[] globList = file.list(new GlobFilenameFilter("*.java")); for (String fn : globList) { System.out.println(fn); } String[] perl5List = file.list(new Perl5FilenameFilter(".+\\.java")); for (String fn : perl5List) { System.out.println(fn); } }
输出:
DepCreater.java
ReadAndWrite.java
DepCreater.java
ReadAndWrite.java
模式匹配的几个问题:
表达式的递归匹配
用正则表达式来分析一个计算式中的括号配对情况,想办法把有嵌套的的成对括号或者成对标签匹配出来。
非贪婪匹配的效率
当一个表达式中,有多个非贪婪匹配时,或者多个未知匹配次数的表达式时,这个表达式将可能存在效率上的陷阱。有时候,匹配速度非常慢。(简单避开方法表达式使用不超过一个非贪婪)
发表评论
-
图片转换成文字
2011-04-04 23:28 1110在工作中,我常常在想 ... -
网银在线支付接口和应用
2011-03-10 10:25 1174最近关注项目中在线支付,所以看一下文档,在线支付应用开发: ... -
Jcrop(图片裁剪)中文文档手册
2011-02-24 23:53 1887多彩科技原创翻译,转载请注明出处:http://www.kmw ... -
java图片裁剪原理
2011-02-24 23:16 1326总体思想: 1.前台网页用js得到裁剪图片的id及x,y ... -
js+java 带进度条的文件上传,同步+异步
2011-02-24 23:12 3293同步上传: 多个文件上传时,按顺序依次上传,后面的必须等待前 ... -
licence控制的设计
2010-12-11 00:06 12951.版权声明 本文是关于如何通过序列号来加载加密 ... -
权限 授权之 - License
2010-12-10 23:57 2256中 国是个盗版软件横 ... -
深入浅出CGlib-打造无入侵的类代理
2010-12-06 00:32 774CGlib是什么? CGlib是一个强大的,高性能,高质 ... -
基于memcached的SNA实现
2010-11-19 00:00 719系统要集群,使用SNA方案。一、 缓存的处理 缓存要使用 ...
相关推荐
Java正则表达式是Java语言中用于处理文本和模式匹配的重要工具,虽然在早期的Java版本中并未直接内置正则表达式支持,但通过引入第三方库如Jakarta-ORO,开发者可以方便地在Java应用中使用正则表达式。Jakarta-ORO是...
为了使用Jakarta-ORO库,首先需要下载并导入相应的类库。以下是一些基本操作的例子: **2.1 匹配字符串** ```java import org.apache.regexp.*; public class RegexExample { public static void main(String[] ...
3. `jakarta-oro-2.0.8.jar`:Jakarta ORO是一个正则表达式库,虽然在这个FTP例子中可能不是必需的,但在某些情况下,它可能会用于处理文件路径或匹配模式。 4. `MyTestFTP01.java`:这是一个Java源代码文件,它...
对于早期版本的Java(1.4之前),或者需要更多灵活性时,可以使用 Jakarta-ORO 库。这是一个开源的正则表达式库,可以作为 Java 的扩展,提供更丰富的正则表达式功能。Jakarta-ORO 库的主要类包括 `Perl5Compiler` ...
在压缩包子文件的文件名称列表中,除了核心的`commons-net-1.4.1.jar`之外,还有其他几个Apache Commons库的版本,如`commons-lang.jar`(提供通用的Java语言实用工具)、`commons-io-1.3.1.jar`(提供I/O流操作的...
Validator框架依赖于以下几个关键的包: - **jakarta-oro.jar**:提供了处理正则表达式的能力,这对于很多验证场景都非常有用。 - **commons-validator.jar**:这是Validator框架的核心库,包含了基本的验证逻辑和...
虽然在Java规范需求(Specification Request)中正则表达式的支持是在后续版本引入的,但在早期版本中,开发者可以通过第三方库如Apache的Jakarta-ORO来实现正则表达式功能。 正则表达式的基础知识包括以下几个关键...
在本书中,作者不仅对Sun公司的`java.util.regex`进行了详细的介绍,还对其他几个流行的正则表达式包进行了对比分析。通过这些对比,读者可以更好地理解如何根据自己的需求来选择合适的正则表达式包。 #### 判断一...
在这是junit测试单元类我就不提交了,在main()方法中有几个小测试,有兴趣自己玩吧. 这个工具类目前主要有25种正规表达式(有些不常用,但那时才仔细深入的研究了一下正规,写上瘾了,就当时能想到的都写了): 1....