正则表达式可选的括号分为强制三组

Regex optional parantheses into forced three groups

我有一个像这样充满括号的字符串:

(this) (should) (be) (group) (one) (thisshouldbegrouptwo) (this) (should) (be) (group) (three)

我想将其正则表达式分为三组,使用常量字符串 thisshouldbegrouptwo,可选地在括号中,分隔组:

1. Group: (this) (should) (be) (group) (one)
2. Group: (thisshouldbegrouptwo)
3. Group: (this) (should) (be) (group) (three)

字符串(thisshouldbegrouptwo)是一个固定的可选字符串,括号也是可选的。如果它不存在,我希望得到以下结果:

1. Group: (this) (should) (be) (group) (one)
2. Group: 
3. Group: (this) (should) (be) (group) (three)

在这种情况下,如果整个字符串在一个组中匹配也可以。

第 1 组或第 3 组的括号数量并不重要,只有中间组周围的括号很重要,如果找到,应该与中间组一起使用,而不是与边缘组一起使用。

到目前为止,这是我的正则表达式 (demo):

(\(.*\))?(?:\s(\(thisshouldbegrouptwo\)\s))?(\(.*\))

此正则表达式将执行您想要的操作:

(.*?)(\(?thisshouldbegrouptwo\)?)(.*)|(.*)

当字符串中出现 thisshouldbegrouptwo 时,第 1 组和第 3 组将具有左右上下文,不包括可能围绕第 2 组的可选括号。

当字符串中不存在该文本时,第 4 组将包含整个字符串。

解决方案的关键要素:

  • 首先使用非贪婪表达式,.*? 而不是 .*,避免将第 2 组的左括号集中到第 1 组。
  • 末尾的|(.*)是包罗万象的,但由于正则表达式是从左到右处理的,所以当第二组字符串出现时,您将获得匹配的第一部分。

我找不到将不匹配的案例分成两组的解决方案,因为在那种情况下没有什么可以将它们分开,但既然你说可以把它放在一起,就把它移到第 4 组因为这个表达式确实适合你。