正则表达式可选的括号分为强制三组
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 组因为这个表达式确实适合你。
我有一个像这样充满括号的字符串:
(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 组因为这个表达式确实适合你。