简单的正则还行,复杂一点的每次要搜索一下就很尴尬
内容
()
括号过多甚至嵌套时,group取值的顺序问题
便于记忆,可以以左括号(
在pattern出现的顺序为group顺序。
以下为示例
@Test
public void testPattern() {
String alphabets = "abcdefghijklmnopqrstuvwxyz";
Pattern pattern = Pattern.compile("abc(def(ghi)jk)lmno(pq(rs)t(uv)w)xyz");
Matcher match = pattern.matcher(alphabets);
match.find();
for (int i = 0; i < 6; i++) {
System.out.printf("match.group(%d): %s\r\n", i, match.group(i));
}
}
以下为输出:
--------------------
match.group(0): abcdefghijklmnopqrstuvwxyz
match.group(1): defghijk
match.group(2): ghi
match.group(3): pqrstuvw
match.group(4): rs
match.group(5): uv
如何为不同的group添加名称,方便匹配
(?<groupAlias>pattern)
,以下为示例
@Test
public void testPattern() {
String alphabets = "abcdefghijklmnopqrstuvwxyz";
Pattern pattern = Pattern.compile("abc(?<g1>def(?<g2>ghi)jk)lm(no)pq");
Matcher match = pattern.matcher(alphabets);
match.find();
for (int i = 1; i < 4; i++) {
System.out.printf("match.group(%d): %s\r\n", i, match.group(i));
}
System.out.printf("match.group(g1): %s\r\n", match.group("g1"));
System.out.printf("match.group(g2): %s\r\n", match.group("g2"));
}
以下为输出:
--------------------
match.group(1): defghijk
match.group(2): ghi
match.group(3): no
match.group(g1): defghijk
match.group(g2): ghi
非获取匹配,即如何使()
不占用group位
(?:pattern)
,以下为示例
@Test
public void testPattern() {
String alphabets = "abcdefghijklmnopqrstuvwxyz";
Pattern pattern = Pattern.compile("abc(?:def(ghi)jk)");
Matcher match = pattern.matcher(alphabets);
match.find();
System.out.printf("match.group(%d): %s\r\n", 1, match.group(1));
}
以下为输出:
--------------------
match.group(1): ghi
关于?=、?<=、?!、?<!
exp1(?=exp2)
:查找 exp2 前面的 exp1。
(?<=exp2)exp1
:查找 exp2 后面的 exp1。
exp1(?!exp2)
:查找后面不是 exp2 的 exp1。
(?<!exp2)exp1
:查找前面不是 exp2 的 exp1。
更多内容可以参考:正则表达式的先行断言(lookahead)和后行断言(lookbehind)