回 帖 发 新 帖 刷新版面

主题:[原创]Java 用正则表达"捕获组"找想要的字符串

[size=4]原文地址(排版更清晰):

[color=FF0000][url]http://www.591pic.com/read-htm-tid-45.html[/url][/color][/size]


[size=3]需求:从一段字符中找到想要的部分。
思考:硬找,肯定可以,但程序长,复杂,容易出错。处理字符串只有正则表达式最强大
什么正则的介绍就不说了,大家就是想知道如何找到我想要的那一串字符。下面将逐渐介绍用正则表达式取字符串的方法。需自带正则表达式基本知识(\\d是数字,\\w是字母,知道最基本的就行)
Java中取得字符串用的是“捕获组“这样的东东,具体将在例子中说明。


Ex1 :  原始String = “1a2b3a”,想知道a前面的数字都是多少
code :

2 Pattern p = Pattern.compile("(\\d)(?=a)");
3 Matcher m = p.matcher(str);

4 while (m.find()) {
5 System.out.println(m.group());
   }

第2行 将“(\\d)a”编译成一个Pattern对象  Pattern:正则表达式的编译表示形式。
第3行 用正则表达式匹配”1a2b3a”
第4行 找下一个符合条件的位置
第5行 打印符合条件的字符。没错的话会打印1 3
详解 :
原理很简单,找到符合条件的(m.find()),然后返回符合该条件的指(m.group())。
关键就在于这个正则表达式,很平时用replaceAll和split的时候不同,多了()。
()在Java正则表达式中表示“捕获组”,而m.group()就是返回捕获到的东西。
(\\d)是第一个组
(?=a)是第二个组
需要解释的是?=a “?=”的意思是”通过零宽度的正 lookahead”(JDK中文版)。没懂,我也没懂,但效果是此组之前的组,且该组不捕获
如果是(\\d)(a)会打印
1a
3a
具有相同类似功能的包括(可见JDK API中文版)
(?:X) X,作为非捕获组
(?idmsux-idmsux)  Nothing,但是将匹配标志i d m s u x on - off
(?idmsux-idmsux:X)  X,作为带有给定标志 i d m s u x on - off 的非捕获组
(?=X) X,通过零宽度的正 lookahead
(?!X) X,通过零宽度的负 lookahead
(?<=X) X,通过零宽度的正 lookbehind
(?<!X) X,通过零宽度的负 lookbehind
(?>X)  X,作为独立的非捕获组
例子最能说明问题
Ex2 :    String = “a=1&b=2&c=3″
把k v分别拿出来

String str = "a=1&b=2&cc=33"; 


Pattern p = Pattern.compile("(\\w+)=(\\d+)"); 
Matcher m = p.matcher(str); 


while (m.find()) { 
System.out.print("key = " + m.group(1)); 
System.out.println("   value = " + m.group(2)); 
}
Print:
key = a   value = 1
key = b   value = 2
key = cc   value = 33
m.group(1)  ->  (\\w+)
m.group(2)  ->  (\\d+)
这个例子如果写全面点可以用来解析URL的参数,很方便


Ex3 :  String = “Ds:410,Ws:400,TB:600,ZJ:599″

找大于500的数字 
String str = "Ds:410,Ws:400,TB:600,ZJ:599"; 


Pattern p = Pattern.compile("([5-9][\\d]{2,})"); 
Matcher m = p.matcher(str); 


while (m.find()) { 
System.out.println(m.group()); 
}
接着,找大于500的人

String str = "Ds:410,Ws:400,TB:600,ZJ:599"; 


Pattern p = Pattern.compile("(\\w*):([5-9][\\d]{2,})"); 
Matcher m = p.matcher(str); 


while (m.find()) { 
System.out.println(m.group(1)); 
}
结束语
捕获组很强,正则表达式还是照样写,让后将想要大部分用()括起来,find一下,然后按照顺序group()一下就可以了[/size]

回复列表 (共1个回复)

沙发


[url=http://www.javaxx.com/java/html/java_fundation/regex/200812/15-96.html]http://www.javaxx.com/java/html/java_fundation/regex/200812/15-96.html[/url]
Java正则表达式参考

我来回复

您尚未登录,请登录后再回复。点此登录或注册