我正在阅读有关正则表达式的Oracle教程。我的主题是“捕获组”。尽管参考文献很好,但是除了括号代表一个组外,在理解该主题方面我发现很多困难。这是我的困惑。
详细举例说明会很好。
假设您有一个字符串,abcabc
并且想弄清楚字符串的第一部分是否与第二部分匹配。您可以使用捕获组和反向引用对单个正则表达式执行此操作。这是我要使用的正则表达式:
(.+)\1
它的工作方式是.+
匹配任何字符序列。因为是在括号中,它抓住了一组。\1
是对st捕获组的反向引用1
,因此它等效于捕获组捕获的文本。进行一些回溯之后,捕获组将匹配字符串的第一部分abc
。\1
现在,反向引用等于abc
,因此它与字符串的后半部分匹配。现在整个字符串都已匹配,因此可以确认字符串的前半部分与后半部分匹配。
反向引用的另一个用途是替换。说你要更换所有{...}
有[...]
,如果里面的文字{
和}
仅是个数字。您可以使用regex轻松捕获组和反向引用
{(\d+)}
并替换为[\1]
。
正则表达式{123}
在字符串中进行匹配abc {123} 456
,并123
在第一个捕获组中捕获。反向引用\1
现在是相当于123
,因此替换{(\d+)}
在abc {123} 456
用[\1]
的结果abc [123] 456
。
存在非捕获组的原因是,通常,组比捕获具有更多用途。正则表达式(xyz)+
匹配完全由xyz
重复的组组成的字符串,例如xyzxyzxyz
。需要一个组,因为xyz+
仅匹配xy
然后z
重复,即xyzzzzz
。使用捕获组的问题是,与未捕获组相比,捕获组的效率稍低,并且占用索引。如果您有一个复杂的正则表达式,其中包含很多组,但是只需要在中间某个地方引用一个,则最好只引用\1
而不是尝试将所有组累加到所需的组。
我希望这有帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句