为什么*正则表达式表示它可以或不可以是它的前一个字符

时间:2015-04-25 14:47:43

标签: regex

以我在一些博客中找到的例子为例 "如何在苹果错误拼写为ale,aple,appple,apppple,apppppple等的给定文件中搜索拼写错误的苹果单词。找到所有模式

grep 'ap*le' filename

读者应该注意到上述模式甚至会匹配啤酒单词,因为*表示前一个字符出现时为0或更多。"

现在它说" ale"我们正在接受ap*le,而不是" ap"和" le"固定?

2 个答案:

答案 0 :(得分:1)

*quantifier,意味着前一个模式的次数为的0次或更多次 - 在这种情况下是单个文字p。您也可以使用量词表示与*相同的内容:

 ap{0,}le

有趣的问题有时候是以前的模式是什么?'将模式放在一个组中通常很有帮助,以帮助理解以前的模式'是

考虑想要找到以下任何一个:

 ale, aple, appple, apppple, apppppple, able, abbbbbbble

您的第一次尝试可能是:

 /ap|b*le/ 

   ^     literal 'p' is the first alternative  #WRONG regex will use 'ap'
    ^   or
     ^  literal 'b'

Demo

在这种情况下你想要的是:

 /a(?:p|b)*le/

Demo

如果您不想匹配ale且仅匹配aple,appple,apppple,apppppple,请使用+代替*,这意味着一个或多个:

/ap+le/

相当于/ap{1,}le/

Demo

如果您只想匹配aple,appple并省略超过3&p; s的变体,请使用额外的最大量词:

/ap{1,3}le/

以上所有变体都会正确拼写apple。如果您只使用了aple,appple和not apple,请使用alteration

/a(?:p|p{3})le/

Demo

答案 1 :(得分:0)

不,不是。

在您的情况下,

“*”表示零或任何p的出现。虽然a和le是固定的。如果您需要修复ap和le,那么这就是您所需要的:

ap+le

“+”表示至少一次,但对发生次数没有限制。

这意味着现在任何数量的p在a之后但在l之前。所以它现在不会选择ale