正则表达式以 abc(ef) ,(ef)abc 和 (ef)abc(gh) 等 3 种模式捕获不带 () 的字符串

Regex to catch a string without () in 3 patterns like abc(ef) ,(ef)abc and (ef)abc(gh)

我已经测试了这个正则表达式
(?<=\))(.+?)(?=\()|(?<=\))(.+?)\b|(.+?)(?=\()

但它不适用于像这种模式的字符串 (ef)abc(gh)

我得到了这样的结果 "(ef)abc"

但是这 3 个正则表达式 (?<=\))(.+?)(?=\() , (?<=\))(.+?)\b, (.+?)(?=\() 分别为 "(ef)abc(gh)""(ef)abc""abc(ef)" .

工作

谁能告诉我问题出在哪里,或者我怎样才能得到预期的结果?

假设您要匹配括号中元素之间的文本,试试这个:

^(?:\(\w*\))?([\w]*)(?:\(\w*\))?$

^            - beginning of string
(?:\(\w*\))? - non-capturing group, match 0 or more alphabetic letters within parens, all optional
([\w]*)      - capturing group, match 0 or more alphabetic letters
(?:\(\w*\))? - non-capturing group, match 0 or more alphabetic letters within parens, all optional
$            - end of string

您尚未指定您可能使用的语言,但这里是 Python 中的示例:

>>> import re

>>> string = "(ef)abc(gh)"
>>> string2 = "(ef)abc"
>>> string3 = "abc(gh)"

>>> p = re.compile(r'^(?:\(\w*\))?([\w]*)(?:\(\w*\))?$')

>>> m = re.search(p, string)
>>> m2 = re.search(p, string2)
>>> m3 = re.search(p, string3)

>>> print m.groups()[0]
'abc'
>>> print m2.groups()[0]
'abc'
>>> print m3.groups()[0]
'abc'
\([^)]+\)|([^()\n]+)

尝试 this.Just 获取捕获或 group.See 演示。

https://regex101.com/r/tX2bH4/6

您的问题是 (.+?)(?=\() 匹配“(ef)abc(gh)”中的“(ef)abc”。

解决此问题的最简单方法是更明确地说明您要查找的内容。在这种情况下,将 "any character" . 与 "any character that is not a parenthesis" [^\(\)].

交换
(?<=\))([^\(\)]+?)(?=\()|(?<=\))([^\(\)]+?)\b|([^\(\)]+?)(?=\()

更简洁的正则表达式是

(?:(?<=^)|(?<=\)))([^\(\)]+)(?:(?=\()|(?=$))