【问题标题】:grep regex match email addressgrep 正则表达式匹配电子邮件地址
【发布时间】:2017-02-01 20:51:04
【问题描述】:

我有一个文件test.txt,其中包含以下内容:

BC@ABSC.CA
ABCabc+-._@mcmaster.io.ca
ABCabc+-._@school.image
ABCabc+-._@school3-computer.image
ABCabc+-._@school3-IT.image.tor.chrome.ca
ABCabc+-._@school3-IT.image.tor.chrome.canadannn
ABC123abc+-._@school3-IT.imageal.tor.chrome.canadannn
ABCabc+-._@school3-*IT.image.tor.chrome.ca
ABCabc+-._@school3-IT.image.tor.chrome.caskdlfj
ABCab*c+-._@school3-IT.image.tor.chrome.caABCabc

然后我用

grep -E '^[A-Za-z0-9+._-]+@([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,6}' test.txt

正在尝试匹配有效的电子邮件。 这里的关键是最后一个子域必须是 2 到 6 个字符的序列。

所以我跳到获得以下输出:

BC@ABSC.CA
ABCabc+-._@mcmaster.io.ca
ABCabc+-._@school.image
ABCabc+-._@school3-computer.image
ABCabc+-._@school3-IT.image.tor.chrome.ca

但我得到以下即使最后一个域的长度成功 6 个字符。

ABCabc+-._@school3-IT.image.tor.chrome.canadannn
ABC123abc+-._@school3-IT.imageal.tor.chrome.canadannn
ABCabc+-._@school3-IT.image.tor.chrome.caskdlfj

我该如何解决这个问题?

【问题讨论】:

  • 不知道为什么投反对票
  • 这是因为您有多个子域(不仅仅是 1 个)。最后加上$
  • @MadPhysicist 嗨,我试过把 $ 放在需要的地方,但它什么也没返回
  • 我刚刚尝试运行 grep -E '^[A-Za-z0-9+._-]+@([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,6}$' test.txt 并得到了您想要的结果。
  • @MadPhysicist 我在 ubuntu 上运行了完全相同的命令,但什么也没得到。不知道为什么。

标签: regex grep


【解决方案1】:

问题是grep 匹配一行中的任何内容。如果您想要确切的整行,请在末尾添加 $ 终止符。我们来看一个例子:

ABCabc+-._@school3-IT.image.tor.chrome.canadannn
  1. ABCabc+-._ 匹配 ^[A-Za-z0-9+._-]+
  2. @ 匹配 @
  3. school3-IT.image.tor.chrome. 匹配 ([a-zA-Z0-9-]+\.)+。据我所知,grep 中的所有量词都是贪婪的。
  4. canada 匹配 [a-zA-Z]{2,6}
  5. nnn 被忽略

如果没有$,则只需要匹配行的某些部分,不一定是全部。

【讨论】:

  • 为什么.chrome 匹配[a-zA-Z]{2,6}。我的正则表达式只允许小写和大写字母。
  • @Jackddddd。抱歉,把点放在错误的地方并更新了我的答案。
  • @Jackddddd。感谢您的选择。点赞也不错。
【解决方案2】:

在你的正则表达式中添加一个endline锚:$:

grep -E '^[A-Za-z0-9+._-]+@([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,6}$' test.txt

更多信息:http://www.regular-expressions.info/anchors.html

【讨论】:

    【解决方案3】:

    您可以通过在字符串末尾添加$ 来修复您的查询。

    grep -E '^[A-Za-z0-9+._-]+@([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,6}$' test.txt
    

    这是一个现场演示:https://regex101.com/r/NtZJQ0/1

    【讨论】:

    • 但是([a-zA-Z0-9-]+\.)+这部分确保每个子域都必须以.结尾,不是吗?
    • 只要在正则表达式末尾加上一个锚点$,问题就已经解决了。请参阅我的更新答案。你也可以试试here
    猜你喜欢
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多