原来写过一篇正则表达式的文章
http://hi.baidu.com/kabike/item/305cb3e591bbf4b52f140ba7
后来又读了一遍《精通正则表达式》,感觉有了新的认识.
捕获组
正则表达式中的括号相当于一个分组,比如下面这个正则表达式,就把字符串分成了"_"分割的三个分组,
然后可以利用$1引用第一个分组,$3引用第三个分组
向前引用
假设想匹配字符串中的"hello hello"这样的字串是很容易的,但是想匹配所有的这样的重复字符串呢(比如 "aaa aaa"和"www www")?
可以利用向前引用,即寻找已经匹配的捕获组.
比如下面这个正则表达式,寻找这样的匹配模式:多个字母(形成了捕获组1),一个空格,捕获组1
http://hi.baidu.com/kabike/item/305cb3e591bbf4b52f140ba7
后来又读了一遍《精通正则表达式》,感觉有了新的认识.
捕获组
正则表达式中的括号相当于一个分组,比如下面这个正则表达式,就把字符串分成了"_"分割的三个分组,
然后可以利用$1引用第一个分组,$3引用第三个分组
- Pattern p = Pattern.compile("([^_]+)_(\\d+)_([^_]+)");
- String src1 = "孙燕姿_20091103_遇见.mp3";
- Matcher m = p.matcher(src1);
- System.out.println(m.replaceAll("$1_$3"));
- //output 孙燕姿_遇见.mp3
Pattern p = Pattern.compile("([^_]+)_(\\d+)_([^_]+)");
String src1 = "孙燕姿_20091103_遇见.mp3";
Matcher m = p.matcher(src1);
System.out.println(m.replaceAll("$1_$3"));
//output 孙燕姿_遇见.mp3
向前引用
假设想匹配字符串中的"hello hello"这样的字串是很容易的,但是想匹配所有的这样的重复字符串呢(比如 "aaa aaa"和"www www")?
可以利用向前引用,即寻找已经匹配的捕获组.
比如下面这个正则表达式,寻找这样的匹配模式:多个字母(形成了捕获组1),一个空格,捕获组1
- Pattern p = Pattern.compile("(\\w+)\\s\\1");
- String src = "I always make make some mistakes when when writting.";
- Matcher m = p.matcher(src);
- while (m.find()) {
- System.out.println(m.group());
- }
- //output make make
- when when
Pattern p = Pattern.compile("(\\w+)\\s\\1");
String src = "I always make make some mistakes when when writting.";
Matcher m = p.matcher(src);
while (m.find()) {
System.out.println(m.group());
}
//output make make
when when