你可以在表达式中使用圆括号来创建一个匹配组,匹配组中的内容将作为一个整体来看待。我们可以对一个匹配组使用量词,或是使用匹配组来限制选择符所能到达的范围。
只有圆括号才能形成匹配组。方括号是定义字符集,花括号是定义量词。
你也可以使用圆括号()
创建一个以数字命名的捕获组。捕获组所匹配到的内容将被引擎保存起来。
例如表达式Set(Value)?
可以匹配 Set 或者 SetValue。在第一种情况下,第一个(也是唯一的)捕获组是空的。第二种情况捕获组匹配 Value。
如果你不想让一个匹配组被捕获,你可以使用非捕获组,例如Set(?:Value)?
。圆括号(
后面的?:
可以创建一个非捕获组。(
后面的?
和和表达末尾的?
没有关系,末尾的问号是一个量词。你可能觉得问号同时具有两种语义可以会造成歧义,但实际上着两种语义不会发生冲突,因为作为量词的问号出现在(
的后面是没有意义的,它不能修饰任何token,所以出现在(
后面的问号只能是非匹配组的语法。
正则中还存在使用(?
的其他类型的组,以后我们会提到。
支持具名匹配组的引擎通常支持把无名的匹配组设置为非捕获组。
捕获组可以保存表达式中的部分匹配结果,并且通过回溯引用我们可以复用这些保存的结果。Backreference还可以在字符串替换中发挥作用。
如果文章出现错误,请给我提Issues - - Github地址
需要进一步翻译的内容:
- 具名匹配组
- 字符串替换