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

时间:2015-01-15 10:23:40

标签: regex

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

但它不适用于此模式(ef)abc(gh)之类的字符串。

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

但这3个正则表达式(?<=\))(.+?)(?=\()(?<=\))(.+?)\b(.+?)(?=\()  为"(ef)abc(gh)""(ef)abc""abc(ef)"单独工作。

任何人都可以告诉我问题在哪里或者我如何得到预期的结果?

3 个答案:

答案 0 :(得分:0)

假设您希望匹配括号中元素之间的文本,请尝试以下方法:

^(?:\(\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'

答案 1 :(得分:0)

\([^)]+\)|([^()\n]+)

试试这个。只需抓住捕获或组。参见演示。

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

答案 2 :(得分:0)

你的问题是(.+?)(?=\()匹配&#34;(ef)abc&#34; in&#34;(ef)abc(gh)&#34;。

解决此问题的最简单方法是更明确地了解您要查找的内容。在这种情况下,通过交换&#34;任何角色&#34; .,&#34;任何不是括号的字符&#34; [^\(\)]

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

更清洁的正则表达式

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