正则表达式检测连字符字符

4

在线演示:http://regex101.com/r/wW6wC4


我正在尝试添加一个正则表达式,允许像这样的电子邮件地址:

asdf.asdf@test-dom-a.com

([\w+\.]+@[\w]{1,})(\.)([0-9a-zA-Z\.\-]{1,})
                                     ^---- Thought this would allow hyphens...

我在这里漏掉了什么?


2
它允许连字符,但您将其定位为仅在@之后的第一个.之后允许连字符。 - Rawling
4个回答

3
您的模式要求连字符出现在句号之后。请改用以下方法:
([\w+.]+@[\w-]{1,})(\.)([0-9a-zA-Z.-]+)

演示

或者更简单地说:

([\w+.]+@[\w.-]+)

尽管第二种模式不要求地址的第二部分包含一个句点,但它仍然可以匹配。
演示: Demonstration

这个正则表达式只匹配列表中的第一个电子邮件地址,不匹配其他的。 - sergserg
@Serg 我已经在你的问题中提到的完全相同的工具中进行了测试。它匹配所有输入模式。 - p.s.w.g
@Serg 如果您第一次测试时没有开启“g”(全局)标志,那么可能只会匹配第一个实例。 - p.s.w.g

1
您的正则表达式:

([\w+\.]+@[\w]{1,})(\.)([0-9a-zA-Z\.\-]{1,})

这将仅允许连字符作为最后一个字符。

要在任何位置允许,请使用:

^([\w+.-]+@[\w-])(\.)([0-9a-zA-Z.-])$

如果只允许在中间使用OR(除了第一个和最后一个位置),请使用以下代码:

^[\w+.-]*@\w[\w-]*\.[\w-]*[0-9a-zA-Z.]+$

工作演示: http://regex101.com/r/lQ1nV7


这样做会不会只允许一个字符出现在末尾? - Cfreak
这在他的示例情况下不起作用。我想你在错误的字符类中添加了“ - ”。 - eldarerathis
$ 前面需要加上 + - Cfreak
1
这并不是真的,它只允许连字符作为最后一个字符。 - Rawling
@Rawling:我的意思是它只允许连字符作为最后一个字符。(我想“only”放错位置了) - anubhava
1
@anubhava 不,它将允许连字符作为@后第一个.之后的任何字符。如果有连字符,则不必是最后一个字符。 - Rawling

1
您的连字符代码出现在检查域名中第一个句点之后的字符段中。您需要将其添加到匹配块中,在域名前面。
([\w+\.]+@[\w\-]{1,})(\.)([0-9a-zA-Z\.\-]{1,})
             ^^----  check here as well.

实际上,我会寻找更全面的电子邮件正则表达式 - 在我看来,你的正则表达式似乎不够强大。

0
你没有匹配形如"asd@fge.hj-kl"的字符串,正如你所看到的那样,这不是你想要的。
([\w+\.]+)@([0-9a-zA-Z\.\-]{1,})\.com
([\w+\.]+)@([0-9a-zA-Z\.\-]{1,})\.([\w]{1,})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接