正则表达式以 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 演示。
您的问题是 (.+?)(?=\()
匹配“(ef)abc(gh)”中的“(ef)abc”。
解决此问题的最简单方法是更明确地说明您要查找的内容。在这种情况下,将 "any character" .
与 "any character that is not a parenthesis" [^\(\)]
.
交换
(?<=\))([^\(\)]+?)(?=\()|(?<=\))([^\(\)]+?)\b|([^\(\)]+?)(?=\()
更简洁的正则表达式是
(?:(?<=^)|(?<=\)))([^\(\)]+)(?:(?=\()|(?=$))
我已经测试了这个正则表达式
(?<=\))(.+?)(?=\()|(?<=\))(.+?)\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 演示。
您的问题是 (.+?)(?=\()
匹配“(ef)abc(gh)”中的“(ef)abc”。
解决此问题的最简单方法是更明确地说明您要查找的内容。在这种情况下,将 "any character" .
与 "any character that is not a parenthesis" [^\(\)]
.
(?<=\))([^\(\)]+?)(?=\()|(?<=\))([^\(\)]+?)\b|([^\(\)]+?)(?=\()
更简洁的正则表达式是
(?:(?<=^)|(?<=\)))([^\(\)]+)(?:(?=\()|(?=$))