专门为初学者编写的正则表达式入门教程

2020-05-10 20:00:16王振洲

提取匹配的子集 重复分组任意次数 参考先前匹配的子字符串 增强可读性 允许复杂的替换

这一章我们先学组如何工作,之后的章节还会有更多例子。

6.1 捕获组

捕获组用(…)表示。下面是一个解释性的例子:

/a(bcd)e/g

捕获组允许提取部分匹配项。

/{([^{}]*)}/g

通过语言的正则函数,您将能够提取括号之间匹配的文本。

捕获组还可以用于对正则表达式进行部分分组,以便于重复。虽然我们将在接下来的章节中详细介绍重复,但这里有一个示例演示了组的实用性。

/a(bcd)+e/g

其他时候,它们用于对正则表达式的逻辑相似部分进行分组,以提高可读性。

/(dddd)-W(dd)/g

6.2 回溯

回溯允许引用之前捕获的子字符串。

匹配第一组可以使用 1,匹配第二组可以使用 2,依此类推…

/([abc])×1×1/g

不能使用回溯来减少正则表达式中的重复。它们指的是组的匹配,而不是模式。

/[abc][abc][abc]/g

/[abc]11/g

下面是一个演示常见用例的示例:

/w+([,|])w+1w+/g

这不能通过重复的字符类来实现。

/w+[,|]w+[,|]w+/g

6.3 非捕获组

非捕获组与捕获组非常相似,只是它们不创建“捕获”。而是采取形式 (?: ...)

非捕获组通常与捕获组一起使用。也许您正在尝试使用捕获组提取匹配的某些部分。而你可能希望使用一个组而不扰乱捕获顺序,这时候你应该使用非捕获组。

6.4 例子

查询字符串参数

/^?(w+)=(w+)(?:&(w+)=(w+))*$/g