搜索的正则表达式模式混乱

时间:2014-02-22 17:11:10

标签: regex bash

在bash中学习正则表达式,我试图获取以.com

结尾的所有行

最初我做了:

cat patternNpara.txt | egrep "^[[:alnum:]]+(.com)$"

为什么: +匹配一个或多个匹配项,因此将其置于alnum之后应该获取任何数字,字或符号的出现,但显然,此逻辑失败....

然后我这样做了:( 纯粹的尝试,而不是真正应用任何逻辑...... )并且它有效

cat patternNpara.txt | egrep "^[[:alnum:]].+(.com)$"

让我感到困惑: .仅匹配单次出现,那么,我如何得到输出...我的意思是它如何真正匹配模式???

问题:上述匹配中[[:alnum:]]+[[:alnum:]].+之间的区别(此中有. )模式及其工作方式???

PS: 我正在寻找可能的解释......不,以这种方式尝试事情......:)

文件patternNpara.txt的一些测试行,它们被作为输出获取!

valid email = abc@abc.com
invalid email = ab@abccom
another invalid = abc@.com
1 : abc,s,11@gmail.com
2: abc.s.11@gmail.com

3 个答案:

答案 0 :(得分:1)

查看您的屏幕截图,您似乎正在尝试匹配具有@字符的电子邮件地址,这也不包含在您的正则表达式中。你可以使用这个正则表达式:

egrep "[@[:alnum:]]+(\.com)" patternNpara.txt

2个正则表达式之间的差异:

  • [[:alnum:]]仅匹配[a-zA-Z0-9]。如果您有@,,那么您还需要将它们包含在角色类中。
  • 您的第二个案例包括。+ pattern表示一个或多个 ANY CHARACTER
  • 的匹配项

答案 1 :(得分:1)

如果您想匹配任何以'.com'结尾的行,您应该使用

egrep ".*\.com$" file.txt

匹配以下所有行

valid email = abc@abc.com
invalid email = ab@abccom
another invalid = abc@.com
1 : abc,s,11@gmail.com
2: abc.s.11@gmail.com

^[[:alnum:]].+(.com)$可行,但^[[:alnum:]]+(.com)$不会。原因如下:

  1. ^[[:alnum:]].+(.com)$表示匹配以a-zA-Z0-9开头的字符串,流动两个或更多个字符,并以'com'结尾(不是'.com')。
  2. ^[[:alnum:]]+(.com)$表示匹配以一个或多个a-zA-Z0-9开头的字符串,流动一个可能是任何内容的字符,并以'com'结尾(不是'.com “)。

答案 2 :(得分:0)

试试这个(带有“积极向前看”):

.+(?=\.com)

演示:

http://regexr.com?38bo0