正则表达式帮助提升

时间:2012-09-19 14:30:20

标签: regex

我有正则表达式问题

我需要验证给定预定义字符串的用户,以检查该字符串中是否存在错误。我在测试下面进行了单元测试,这样你就可以看到哪些字符串必须匹配,哪些不匹配。 我已经拥有并为大多数人工作:

/^product:\[(.*?)\]|default:\[(.*?)\]$/

还需要测试的是,必须没有任何空格,这不会计入[]和|之间的值。一定是在那里。但不是最后

return array(
        array(
            'default:[6_400]',
            TRUE
        ),
        array(
            'default:[bla_bla]',
            TRUE
        ),
        array(
            'default:[bla _ bla]',
            TRUE
        ),
        array(
            'product:8[8_400]|default:[6_400]',
            TRUE
        ),
        array(
            'product:8[8_400]|default:[6_400]|product:10[10_400]',
            TRUE
        ),
        array(
            'product:8[8_400]|product:12 [12_400]|default:[6_400]',
            FALSE
        ),
        array(
            'roduct:8[8_400]|product:12[12_400]|default[6_400',
            FALSE
        ),
        array(
            'default:6_400',
            FALSE
        ),
        array(
            'product:8[8_400]',
            FALSE
        ),
        array(
            'product:8[8_400]default:[6_400]',
            FALSE
        ),
        array(
            'product:8[8_400]|default:[6_400]|',
            FALSE
        ),
    );

2 个答案:

答案 0 :(得分:1)

看看你的例子,我认为你的意思是在括号内你想要单词字符或空格(你可能不希望#$%^&&,null和其他类似的东西)......

\[[\w\s]+\]

这显然可以通过以下任一产品获得:数字或默认值:

((product:\d+)|(default:))(\[[\w\s]+\])

子句必须用|分隔但匹配的字符串不得以“|”

结尾
((product:\d+)|(default:))(\[[\w\s]+\])(\|(?!$)|$)

这可能会发生一次或多次

(((product:\d+)|(default:))(\[[\w\s]+\])(\|(?!$)|$))+

我们必须至少有一个完整的合法默认条款:

(?=.*?default:\[[\w\s]+\])(((product:\d+)|(default:))(\[[\w\s]+\])(\|(?!$)|$))+

并填写整行:

^(?=.*?default:\[[\w\s]+\])(((product:\d+)|(default:))(\[[\w\s]+\])(\|(?!$)|$))+$

此处处于行动中http://regexr.com?3275i

请注意,由于我没有包含任何允许除括号以外的任何地方的空格的模式,因此不需要做任何特殊操作来禁止它在括号外

另请注意,我创建了许多捕获组(为了简单/可读性),但您可以通过放置?:在任何之后(您不想捕获)来消除它们。这在一定程度上提高了性能。除了在regexr.com中测试内容之外,这个网站通常有助于学习/构建正则表达式:

http://www.regular-expressions.info/

答案 1 :(得分:0)

试试这个正则表达式:

/^(?=.*?default)(?:(?:product|default):\d*\[[^\]]*\](?:\|(?!$)|$))+$/

rubular

如果您想排除default可能出现在[]中的可能性,正如Gabber指出的那样,您可以使用:

/^(?:product:\d*\[[^\]]*\]\|)?(?:default:\d*\[[^\]]*\](?:\|(?!$)|$))(?:product:\‌​d*\[[^\]]*\](?:\|(?!$)|$))?$/