Regex / PHP检查字符组是否仅出现一次

| 我正在尝试使用REGEX验证PHP中的输入。我想检查输入中是否包含“ 0”字符组,并且该输入仅出现一次。否则,规则将失败。 这是我尝试过的:
preg_match(\'|^[0-9a-zA-Z_-\\s:;,\\.\\?!\\(\\)\\p{L}(%s){1}]*$|u\', $value);
(除此之外,还有其他一些规则;我已经尝试过
(%s){1}
部分,但它不起作用)。 我相信这是一个非常简单的解决方案,但是我真的不喜欢REGEX的...谢谢您的帮助!     
已邀请:
        如果我理解您的问题,则需要积极向前。前瞻使表达式仅在找到单个%s时才匹配。
preg_match(\'|^(?=[^%s].*?[%s][^%s]*$)[0-9a-zA-Z_-\\s:;,\\.\\?!\\(\\)\\p{L}(%s){1}]*$|u\', $value);
我将解释每个部分的工作原理
^(?=[^%s].*?[%s][^%s]*$)
是零宽度的断言-
(?=regex)
是正向预言-(表示它必须匹配,但不能“吃掉”任何字符)。这意味着整行只能有1
%s
[0-9a-zA-Z_-\\s:;,\\.\\?!\\(\\)\\p{L}(%s){1}]*$
regex的其余部分还将查看整个字符串,并确保整个字符串仅由字符类中的字符组成(如您的原始regex)。     
        在Johnsyweb建议使用另一种方法执行验证之后,我设法用PHP \的substr_count()函数做到了这一点,并且因为REGEX \的建议似乎非常复杂。 再次感谢你!     
        另外,您可以在样式中使用
preg_match_all
并检查匹配数。如果为1,则表示一切正常,例如:
$result = (preg_match_all(\'|^[0-9a-zA-Z_-\\s:;,\\.\\?!\\(\\)\\p{L}(%s){1}]*$|u\', $value) == 1)
    
        尝试这个:
\'|^(?=(?:(?!%s).)*%s(?:(?!%s).)*$)[0-9_\\s:;,.?!()\\p{L}-]+$|u\'
方括号内的
(%s){1}
序列可能并没有您认为的那样,但是没关系,解决方案更加复杂。实际上,
{1}
绝不应出现在正则表达式中的任何位置。正如许多人所假设的那样,它并不能确保只有一种东西。事实上,它什么也没做。它是纯粹的混乱。 编辑(对评论的回答):为确保字符串中仅存在特定序列中的一个,您必须积极检查每个单个字符,将其分类为-0的一部分或不是-0的一部分。为此,在否定超前确认该字符不是“ 0”的开始之后,“ 15”一次消耗一个字符。 当lookahead表达式的该部分退出匹配时,字符串中的下一个内容必须为“ 0”。然后第二个
(?:(?!%s).)*$
插入以确认直到字符串末尾不再有
%s
序列。 并且不要忘记,必须将前瞻表达式放在两端。因为前瞻是主正则表达式开始锚之后的第一件事,所以您无需添加其他“ 20”。但是先行必须以自己的ѭ21锚结束。     
        如果您不是“成”正则表达式,为什么不使用PHP解决呢? 一次调用内置的
strpos()
会告诉您字符串是否匹配。第二个电话会告诉您它是否出现多次。 这将使您更容易阅读和维护。     

要回复问题请先登录注册