如何在捕获组中捕获组?

how to capture group within capture group?

例如,字符串:

bla bla bla (bla oops bla
bla bla bla 
bla bla bla) bla oops
bla bla bla 
oops bla (bla bla oops
bla)

如何在括号之间得到 'oops'? 首先,我得到方括号之间的文本:

(?<=\()([\w\W]*?)(?=\))

我可以在捕获组内的同一个正则表达式捕获组中(在捕获组内找到 'oops')吗?

您可以使用以下正则表达式:

(?<=\()([\w\W]*?(oops)[\w\W]*?)(?=\))

基本上它会注入一个 Group 寻找 'oops' 然后它会在捕获的组之前和之后加倍匹配“[\w\W]*?”。

现在 'oops' 将在 Group 2

您可以使用

(?:\G(?!\A)|\()[^()]*?\Koops

或者,如果您必须检查右括号,请在末尾添加前瞻:

(?:\G(?!\A)|\()[^()]*?\Koops(?=[^()]*\))

regex demo

详情

  • (?:\G(?!\A)|\() - ( 或上一场比赛结束 (\G(?!\A))
  • [^()]*? - 除了 ()
  • 之外的任何 0+ 个字符
  • \K - match reset operator
  • oops - 您需要的单词(如果您需要整个单词匹配,请用 \b 换行)
  • (?=[^()]*\)) - positive lookahead 需要除 () 以外的 0+ 个字符,直到第一个 ) 立即出现在右侧当前位置。