我有正则表达式问题
我需要验证给定预定义字符串的用户,以检查该字符串中是否存在错误。我在测试下面进行了单元测试,这样你就可以看到哪些字符串必须匹配,哪些不匹配。 我已经拥有并为大多数人工作:
/^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
),
);
答案 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中测试内容之外,这个网站通常有助于学习/构建正则表达式:
答案 1 :(得分:0)
试试这个正则表达式:
/^(?=.*?default)(?:(?:product|default):\d*\[[^\]]*\](?:\|(?!$)|$))+$/
如果您想排除default
可能出现在[]
中的可能性,正如Gabber指出的那样,您可以使用:
/^(?:product:\d*\[[^\]]*\]\|)?(?:default:\d*\[[^\]]*\](?:\|(?!$)|$))(?:product:\d*\[[^\]]*\](?:\|(?!$)|$))?$/