我有正则表达式:
([A-Za-z0-9_]+?)[ ]?(\()?(?(2)([A-Za-z0-9=\-\/°%= ]*)\))_([A-Za-z0-9]*)$
^
|
condition
它应符合以下内容:
name (unit)_type
name(unit)_type
long_name_type
name_type
问题是我有4个捕获组而不是3个:
[1] => Array
(
[0] => name
)
[2] => Array
(
[0] => (
)
[3] => Array
(
[0] => unit
)
[4] => Array
(
[0] => type
)
然而,当我将括号的捕获组更改为非捕获组时,如下所示:
([A-Za-z0-9_]+?)[ ]?(?:\()?(?(2)([A-Za-z0-9=\-\/°%= ]*)\))_([A-Za-z0-9]*)$
^
|
here
它不起作用。
有没有机会获得这样的比赛?
[1] => Array
(
[0] => name
)
[2] => Array
(
[0] => unit
)
[3] => Array
(
[0] => type
)
编辑: 完成所有提示后,我将其简化为:
(\w+?) *(?:\(([A-Za-z0-9\/°%= -]*)\))?_([A-Za-z0-9]*)$
答案 0 :(得分:2)
看起来你真的不需要正则表达式。
为什么不简单地使用可选的非捕获组:
([A-Za-z0-9_]+?)[ ]?(?:\(([A-Za-z0-9=\-\/°% ]*)\))?_([A-Za-z0-9]*)$
^^^^ ^
[注意:在字符类中有2个=
符号,我删除了其中一个,因为在字符类中使用两个是多余的]
答案 1 :(得分:1)
看起来你可以使用\w
简化它并消除一些不必要的字符类。然后,您可以使用非捕获组:
(\w+?) *(?:\(([A-Za-z0-9\/°%= -]*)\))?_([A-Za-z0-9]*)$
工作示例:http://regex101.com/r/wZ8nP8
此外,如果字符类位于开头或结尾,则无需转义-
。
@nhahtdh的每个建议修复了最后一节以排除_
(返回字符类)。另请注意,前一个示例已损坏long_name
。