Files
rikako-note/regular expression/正则进阶语法.md
2024-03-10 22:54:03 +08:00

3.5 KiB
Raw Permalink Blame History

正则表达式

语法

No Capturing Group (?:regex)

如果不想要正则表达式中的group捕获其匹配可以通过在group的左(符号后指定?:其会将group设置为非捕获匹配。

# 使用示例如下
color=(?:red|green|blue)

Named Caputure Group (?<name>regex)

在java中支持named group机制从而可使用name来获取识捕获的匹配。其可以避免在复杂表达式中通过下表进行匹配时带来的复杂解析问题。

使用语法为(?<name>regex),使用示例如下所示:

[Ww]indows(?<versionTag>95|98|7|8|10|11)
public static void testRegex() {
    Pattern pattern = Pattern.compile("[Ww]indows(?<versionTag>95|98|7|8|10|11)");
    Matcher matcher = pattern.matcher("I use windows11 Operating System...");
    if(matcher.find()) {
        String versionTag = matcher.group("versionTag");
        System.out.printf("windows version used is %s%n", versionTag);
    } else {
        System.out.println("I don't use Windows System");
    }
}

Atomic Grouping (?>regex)

在正则表达式中,支持通过(?>regex)的语法来指atomic grouping。当指定匹配为atomic grouping后例如a(?>bc|b)c其会匹配abcc但是不会匹配abc。

因为当一个group被指定atomic grouping后一旦该group成功匹配过一次那么其会丢弃group中token记录的backtracking position不会再尝试group中指定的其他匹配。例如在匹配abc时(?>bc|b)表达式和bc匹配成功后atomic grouping即会丢弃回溯位置后续regex的末尾c字符无法匹配,即会导致整个匹配失败,而不会回溯后重新匹配(?>bc|b)中的b

使用示例如下所示:

# 其会匹配abcc但是不会匹配abc
 a(?>bc|b)c

Negative Lookahead (?!regex)

通过negative Lookahead语法可以指定后面不被...跟随的正则表达式。例如,q(?!u),其会匹配aqe字符串中的q

注意,q[^u]是无法表示和q(?!u)一样的效果的,因为q(?!u)匹配的是aqe字符串中的q,而q[^u]匹配的则是aqe字符串中的qe

并且,Negative Lookahead是No Caputure Group

使用示例如下所示:

# 其会匹配aqe字符串中的q
q(?!u)

Positive Lookahead (?=regex)

通过positive lookahead的语法则是可以指定后面被...跟随的正则表达式,例如q(?=u)。但是,u并不会成为该regex匹配的一部分。

并且,Negative Lookahead是No Caputure Group

使用示例如下所示:

# 匹配后缀有u的q例如aqua中的q
q(?=u)

如果想要捕获Lookahead中的匹配内容可以使用(?=(regex))的语法。

Negative Lookbehind (?<!regex)

Negative Lookbehind和Negative Lookahead类似但是是针对前缀做断言。其会告诉regex引擎暂时性后退一步检测lookbehind中指定的regex是否可以匹配。

该语法匹配前面不由...前缀的正则表达式。

(?<!a)b正则表达式,则是可以匹配bdebt中的b,但是匹配不了cab中的b

使用示例:

(?<!a)b

Positive Lookbehind `(?<=regex)

该语法匹配前面由...前缀的正则表达式。

(?<=a)b可以匹配cab中的b,但是无法匹配bdebt中的b。

使用示例:

(?<=a)b

不包含某表达式的语法

如果想要通过正则来表达不包含...的语法,可以通过^((?!regex).)*$来表示。