我试图在一些格式错误的文本上应用正则表达式。一般格式为:
descriptor (one|two|three|four) code
理想的输入示例:
hello world (one) 0039x
我想拍摄3组:
"hello world", "one", "0039x"
(注意组(2)中缺少括号)
格式错误的例子:
hello (world) (two) 0039x
hello (world) three 0039x
hello world, four 0039x
hello (world)*,four 0039x
descriptor
应保留任何括号和符号(但会忽略逗号),即"hello (world)*"
也有效。
以下是我提出的建议:
([a-z0-9 \*\(\)]*),?\s?\(?(one|two|three|four)\)?\s([a-z0-9]+)
它运作正常,但问题是descriptor
倾向于贪婪地捕获开括号。即,从理想的例子:
"hello world (", "one", "0039x"
什么是更好的正则表达式,适用于正常情况和畸形案件?前瞻可能很有用,但我不确定如何使用(?:...)
并捕获任何括号,如果它也是descriptor
的一部分。
答案 0 :(得分:0)
假设你想在(one|two|three|four)
之前匹配直到逗号或空格,你可以使用这个正则表达式:
^(.+?)[\s,]\(?(one|two|three|four)\)?\s([a-z0-9]+)$
答案 1 :(得分:0)
你的正则表达式似乎唯一的问题是你的括号是可选的,而你的好/坏样本暗示它们是必需的(删除2 ?
s):
([a-z0-9 \*\(\)]*),?\s?\((one|two|three|four)\)\s([a-z0-9]+)