我正在尝试将正则表达式约束应用于 Symfony 表单输入。输入的要求是字符串的开头和所有逗号必须后跟零个或多个空格,然后是 #
或 @
符号,除非它是空的字符串。
据我所知,没有办法告诉约束使用 preg_match_all
而不仅仅是 preg_match
,但它确实有能力否定匹配.因此,我需要一个 preg_match
不会匹配给定场景的正则表达式:任何包含字符串开头或逗号的字符串,后跟零个或多个空格,后跟任何字符这不是 # 或 @,也不是字符串的结尾
,但会匹配其他所有内容。下面是几个例子:
preg_match(..., ''); // No match
preg_match(..., '#yolo'); // No match
preg_match(..., '#yolo, #swag'); // No match
preg_match(..., '#yolo,@swag'); // No match
preg_match(..., '#yolo, @swag,'); // No match
preg_match(..., 'yolo'); // Match
preg_match(..., 'swag,#yolo'); // Match
preg_match(..., '@swag, yolo'); // Match
我肯定认为 /(^|,)\s*[^@#]/
会起作用,但它在每种情况下都失败了,有 1 个或多个空格,它出现是因为星号。如果我去掉星号,preg_match('/(^|,)\s[^@#]/', '#yolo, @swag')
不匹配(根据需要)只有一次空间,但只要我重新引入星号,它就会因任何数量的空间 > 0 而中断。
我的理论是正则表达式引擎将第二个空格解释为不在字符集 [@#]
中的字符,但这只是一个理论,我不知道该怎么做做吧。我知道我可以创建一个自定义约束来使用 preg_match_all
来解决这个问题,但我想尽可能避免这种情况。
最佳答案
你可以使用
'~(?:^|,)\s*+[^#@]~'
这里,+
符号定义了一个*+
possessive quantifier匹配 0 次或多次出现的空白字符,如果 [^@#]
无法匹配后续字符,则不允许正则表达式引擎回溯到 \s*
模式。
参见 regex demo .
详情
(?:^|,)
- 字符串开头或,
\s*+
- 零个或多个空白字符,所有格匹配(即,如果下一个字符不与[^#@]
模式匹配,整个模式匹配将失败)[^@#]
- 匹配除@
和#
之外的任何字符的否定字符类。
关于PHP 正则表达式 : zero or more whitespace not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49618161/