grep正则表达式匹配电子邮件地址

时间:2017-02-01 20:51:04

标签: regex grep

我有一个文件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

我如何解决这个问题?

3 个答案:

答案 0 :(得分: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被忽略
  6. 如果没有$,就必须有匹配的行的部分,不一定是整个行。

答案 1 :(得分:0)

在您的正则表达式中添加一个结束线锚:gridItem: { margin: 5, width: Dimensions.get('window').width / 2.2, //Device width divided in almost a half height: 150, justifyContent: 'center', alignItems: 'center', },

$

有关它的更多信息:http://www.regular-expressions.info/anchors.html

答案 2 :(得分:-1)

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

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

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