具有非捕获组的REGEX条件

时间:2014-01-12 19:42:52

标签: php regex

我有正则表达式:

([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]*)$

2 个答案:

答案 0 :(得分:2)

看起来你真的不需要正则表达式。

为什么不简单地使用可选的非捕获组:

([A-Za-z0-9_]+?)[ ]?(?:\(([A-Za-z0-9=\-\/°% ]*)\))?_([A-Za-z0-9]*)$
                     ^^^^                         ^

regex101 demo

[注意:在字符类中有2个=符号,我删除了其中一个,因为在字符类中使用两个是多余的]

答案 1 :(得分:1)

看起来你可以使用\w简化它并消除一些不必要的字符类。然后,您可以使用非捕获组:

(\w+?) *(?:\(([A-Za-z0-9\/°%= -]*)\))?_([A-Za-z0-9]*)$

工作示例:http://regex101.com/r/wZ8nP8

此外,如果字符类位于开头或结尾,则无需转义-

@nhahtdh的每个建议修复了最后一节以排除_(返回字符类)。另请注意,前一个示例已损坏long_name