正则表达式匹配单个点,但不匹配两个点


Regular expression to match single dot but not two dots?

尝试为电子邮件地址检查创建正则表达式模式。这将允许使用点 (.(,但如果有多个相邻的点,则不允许。

应匹配:test.test@test.com

不应匹配:test..test@test.com

现在我知道互联网上有成千上万的电子邮件匹配示例,所以请不要向我发布带有完整解决方案的链接,我正在尝试在这里学习。

其实我最感兴趣的部分只是本地部分:测试.测试应该匹配和测试..不应匹配的测试。谢谢你的帮助。

您可以通过在

它们之间使用析取(管道符号|(来允许任意数量的[^'.](除点以外的任何字符(和[^'.])'.[^'.](由两个非点包围的点(,并将整个事物与*(任意数量的(放在^$之间,以便整个字符串由这些组成。代码如下:

$s1 = "test.test@test.com";
$s2 = "test..test@test.com";
$pattern = '/^([^'.]|([^'.])'.[^'.])*$/';
echo "$s1: ", preg_match($pattern, $s1),"<p>","$s2: ", preg_match($pattern, $s2);

收益 率:

test.test@test.com: 1
test..test@test.com: 0

这对我来说更合乎逻辑:

/[^.](['.])[^.]/

这很简单。前瞻和后视确实很有用,因为它们不能捕捉价值。但在这种情况下,捕获组仅在中间点附近。

strpos($input,'..') === false

strpos函数更简单,如果"$input"没有"..",则测试成功。

为了回答标题中的问题,我会更新Junuxx的RegExp,并允许在字符串的开头和结尾使用点:

'/^'.?([^'.]|([^'.]'.))*$/'

这是可选的.开头后跟任意数量的非.或 [非.后跟 .]。

^([^.]+'.?)+@$

这应该可以解决@之前的事情,剩下的就交给你了。请注意,您应该对其进行更多优化以避免其他奇怪的角色设置,但这似乎足以回答您感兴趣的问题。

不要忘记像我第一次做的那样^$:(

还忘了砍.——傻我