2

我有一个正则表达式问题

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

/^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
        ),
    );
4

2 回答 2

1

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

\[[\w\s]+\]

这显然可以通过 product:number 或 default 来处理:

((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

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

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

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

于 2012-09-19T17:04:07.210 回答
0

试试这个正则表达式:

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

红字

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

/^(?:product:\d*\[[^\]]*\]\|)?(?:default:\d*\[[^\]]*\](?:\|(?!$)|$))(?:product:\‌​d*\[[^\]]*\](?:\|(?!$)|$))?$/
于 2012-09-19T14:36:08.253 回答