Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 搜索正则表达式模式中的混乱_Regex_Bash - Fatal编程技术网

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

Regex 搜索正则表达式模式中的混乱,regex,bash,Regex,Bash,在bash中学习regex时,我试图获取以.com 起初我是这样做的: cat patternNpara.txt | egrep "^[[:alnum:]]+(.com)$" 原因:+匹配一个或多个匹配项,因此将其放在alnum之后应获取任何数字、单词或符号的匹配项,但显然,此逻辑失败了 然后我做了这件事:(纯粹是点击并尝试,没有真正应用任何逻辑…)它成功了 cat patternNpara.txt | egrep "^[[:alnum:]].+(.com)$" 什么让我困惑:只匹配一个匹配

在bash中学习regex时,我试图获取以
.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

看看你的截图,你似乎在试图匹配带有
@
字符的电子邮件地址,而这个字符没有包含在你的正则表达式中。您可以使用此正则表达式:

egrep "[@[:alnum:]]+(\.com)" patternNpara.txt
两个正则表达式之间的差异:

  • [[:alnum:]
    仅匹配
    [a-zA-Z0-9]
    。如果有
    @
    ,则还需要将它们包含在字符类中
  • 您的第二个案例包括.+模式,这意味着任何字符的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)$
将不起作用。原因如下:

  • ^[:alnum:].+(.com)$
    表示匹配以
    a-zA-Z
    0-9
    开头、流动两个或更多任意字符并以“com”(而不是“.com”)结尾的字符串
  • ^[:alnum:][+(.com)$
    表示匹配以一个或多个
    a-zA-Z
    0-9
    开头的字符串,其中一个字符可以是任何字符,并以“com”(而不是“.com”)结尾
  • 试试这个(用“积极前瞻”):

    演示:


    +
    匹配任何字符中的一个或多个。因此,模式匹配一个alnum,后跟一个或多个任意值。如果你给它
    a.b.com
    ,它将不匹配。
    “^[:alnum:]+(.com)$”
    工作正常。@anubhava:它在我的机器上不工作。。请查看相同=>@Gene
    ^[:alnum:]+(.com)$
    的屏幕截图,因为“.”字符,无法与
    a.b.com
    匹配,但是
    ^[:alnum:]+.com)$
    当然可以。@NoobEditor patternPara.txt的内容是什么?WADR,我不是在寻找一种过滤掉这些行的解决方案,我想了解为什么
    +
    可以工作,而只有
    +
    无法捕获字符串!!!但我想我已经解释了为什么你的正则表达式不起作用了。(请参阅有关字符类中缺少
    @
    的说明)。请理解
    [[:alnum:]
    仅匹配
    [a-zA-Z0-9]
    。如果您有
    @
    或逗号,那么您也需要将它们包括在字符类中。仍然不起作用=>..。此外,如果
    @
    是问题的原因,为什么它在第二种情况下有效,而不是在第一种情况下有效???您的第二种情况包括
    +
    模式,这意味着任何字符都有一个或多个匹配项。伙计…如果您给我一个
    解决方案
    ,我要求对问题进行解释…(请参阅PS部分)?@NoobEditor已添加解释,请参阅我的更新答案。
    .+(?=\.com)