NiceLeeのBlog 用爱发电 bilibili~

备忘录 关于正则匹配的一些笔记

2022-07-16
nIceLee

阅读:


简单的正则还行,复杂一点的每次要搜索一下就很尴尬

内容

()括号过多甚至嵌套时,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)


内容
隐藏