正则表达式小探

 

正责表达式简介:

正则表达式"(Regular Expression)就是一个字符构成的串,它定义了一个用来搜索匹配字符串的模式。
许多语言,包括Perl、PHP、Python、JavaScript和JScript,都支持用正则表达式处理文本,一些文本编辑器用正则表达式实现高级"搜索-替换"功能。那么Java又怎样呢?
你可以从Apache.org下载源代码开放的Jakarta-ORO库。 

 Jakarta-ORO包分析:

oro包类结构:


 

Jakarta-ORO库

我首先将简要介绍使用Jakarta-ORO库时你必须创建和访问的对象,然后介绍如何使用Jakarta-ORO API。

1、PatternCompiler对象:

创建一个Perl5Compiler类的实例,并把它赋值给PatternCompiler接口对象。Perl5Compiler是PatternCompiler接口的一个实现,允许你把正则表达式编译成用来匹配的Pattern对象。

    PatternCompiler compiler = new Perl5Compiler();
2、Pattern对象

要把正则表达式编译成Pattern对象,调用compiler对象的compile()方法,并在调用参数中指定正则表达式。例如,你可以按照下面这种方式编译正则表达式"j[so]n":

try {
                Pattern pattern = compiler.compile("j[so]n");
             } catch (MalformedPatternException e) {
               e.printStackTrace();
             }

默认情况下,编译器创建一个大小写敏感的模式(pattern)。因此,上面代码编译得到的模式只匹配"jsn"、"jon",但不匹配"Jsn"和"joN"。
要创建一个大小写不敏感的模式,你应该在调用编译器的时候指定一个额外的参数:

    Pattern pattern = compiler.compile("j[so]n", Perl5Compiler.CASE_INSENSITIVE_MASK);
 3、PatternMatcher对象

PatternMatcher对象根据Pattern对象和字符串进行匹配检查。你要实例化一个Perl5Matcher类并把结果赋值给PatternMatcher接口。Perl5Matcher类是PatternMatcher接口的一个实现,它根据Perl 5正则表达式语法进行模式匹配:

PatternMatcher matcher = new Perl5Matcher();

使用PatternMatcher对象,你可以用多个方法进行匹配操作,这些方法的第一个参数都是需要根据正则表达式进行匹配的字符串:
- boolean matches(String input, Pattern pattern):当输入字符串和正则表达式要精确匹配时使用。换句话说,正则表达式必须完整地描述输入字符串。
- boolean matchesPrefix(String input, Pattern pattern):当正则表达式匹配输入字符串起始部分时使用。
- boolean contains(String input, Pattern pattern):当正则表达式要匹配输入字符串的一部分时使用(即,它必须是一个子串)。
另外,在上面三个方法调用中,你还可以用PatternMatcherInput对象作为参数替代String对象;这时,你可以从字符串中最后一次匹配的位置开始继续进行匹配。当字符串可能有多个子串匹配给定的正则表达式时,用PatternMatcherInput对象作为参数就很有用了。用 PatternMatcherInput对象作为参数替代String时,上述三个方法的语法如下:
- boolean matches(PatternMatcherInput input, Pattern pattern)
- boolean matchesPrefix(PatternMatcherInput input, Pattern pattern)
- boolean contains(PatternMatcherInput input, Pattern pattern)

Perl5Util类使用

 

Perl5Util查找格式: 
[ m ] / pattern / [ i ][ m ][ s ][ x ] 
第一个m写不写都可以
i  忽略大小写
m  多行模式
s  单行模式
x  使用扩展语法
查找  MyDoc/Java/SimpleJava  时 
正常写法  "m/MyDoc 
/Java/SimpleJava/"
扩展写法  "m#MyDoc/Java/SimpleJava#x"

例:查找字符串中包含的数字,匹配一次或多次

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

例:分组输出

Perl5Util util = new Perl5Util();
PatternMatcherInput matcherInput = new PatternMatcherInput("192.168.0.1@08/10/2010");
while (util.match("m#08(/10/)2010#x", matcherInput)) {
     MatchResult result = util.getMatch();
     System.out.printf("%s : %s/n", 0, result.group(0));
     System.out.printf("%s : %s/n", 1, result.group(1));
}

输出:
0 : 08/10/2010
1 : /10/

Perl5Util替换格式:
s / pattern / replacement / [ g ][ i ][ m ][ o ][ s ][ x ] 
第一个s必须要写
g 全部替换。默认只替换第一个 
i  忽略大小写
m  多行模式
o   只替换第一个
s  单行模式
x  使用扩展语法
例:替换,将"-"替换成","全局搜索

String str = "2010-12-01 17:16:32";
Perl5Util plutil = new Perl5Util();
String result = plutil.substitute("s/-/,/g", str);
System.out.println(result);

输出:
2010,12,01 17:16:32

注:Java5的正则表达式的实现可能会导致JVM的崩溃;在递归处理上性能极度低下.最好用oro库来解决这类问题。详见宝典

正责表达式规则介绍

常用的正责表达式元字符

.匹配任意字符*修饰匹配符为0次任意次
^匹配输入行的开始位置$匹配输入行的结束位置
+修饰匹配符至少1次?修饰匹配符0次或1次
[]用来自定义匹配"多种字符"表达式{}修饰匹配次数的符号
/s空格/S非"空格"字符
/d匹配任何一个0-9数字/D匹配一个非0-9数字
/w匹配一个 数字、字母或下划线/W匹配一个非 数字、字母和下划线
*?非贪婪修饰匹配符为0次任意次+?非贪婪修饰匹配符至少一次
??非贪婪修饰匹配符0次或1次()把一个表达式做为一个匹配整体
两边的表达式为"或"的关系

 转义字符

在正则表达式中对一些特殊符号和特殊含义的字符的使用需要用"/"进行转义操作,需要转义的字符除了包括以上列出的"元字符"外,还有以下这些具有具体含义的字符:

/t横向制表符/n换行符
/r回车符{
}}
转义字符本身

修饰符

用在正则表达式结尾。例如 /asdf/i,"i"即为"修饰符",意思是不区分大小写的匹配"asdf"。所有修饰符的含义如下表:

g全局匹配i忽略大小写
m多行匹配s把整个匹配串当作一行处理
x允许注释和空格的出现

备注:
1、非贪婪模式存在的效率问题
2、表达式的递归匹配

相关资料链接:

jakarta-oro包下载:http://jakarta.apache.org/site/downloads/downloads_oro.cgi

 http://www.360doc.com/content/10/0805/09/561_43777969.shtml

http://blog.csdn.net/yuanchao3333/archive/2009/01/31/3855418.aspx

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值