以我在一些博客中找到的例子为例 "如何在苹果错误拼写为ale,aple,appple,apppple,apppppple等的给定文件中搜索拼写错误的苹果单词。找到所有模式
grep 'ap*le' filename
读者应该注意到上述模式甚至会匹配啤酒单词,因为*表示前一个字符出现时为0或更多。"
现在它说" ale"我们正在接受ap*le
,而不是" ap"和" le"固定?
答案 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'
在这种情况下你想要的是:
/a(?:p|b)*le/
如果您不想匹配ale
且仅匹配aple,appple,apppple,apppppple,请使用+
代替*
,这意味着一个或多个:
/ap+le/
相当于/ap{1,}le/
如果您只想匹配aple,appple并省略超过3&p; s的变体,请使用额外的最大量词:
/ap{1,3}le/
以上所有变体都会正确拼写apple
。如果您只使用了aple,appple和not apple,请使用alteration:
/a(?:p|p{3})le/
答案 1 :(得分:0)
不,不是。
在您的情况下,“*”表示零或任何p的出现。虽然a和le是固定的。如果您需要修复ap和le,那么这就是您所需要的:
ap+le
“+”表示至少一次,但对发生次数没有限制。
这意味着现在任何数量的p在a之后但在l之前。所以它现在不会选择ale
。