从perl搜索中排除单个模式并用单词边界匹配替换

时间:2012-02-18 11:59:49

标签: regex perl

在询问this perl newbie question后,我有一个perl新手跟进。我发现了一个案例,其中使用单词boundary失败了我的应用程序,它执行此正则表达式搜索并替换一组文件:

s/\bcat\b/cat_tastic/g

我还希望-cat不能替换匹配,尽管它目前是匹配的,因为连字符被认为是单词边界。我已经阅读了单词边界,但我学到的是在使用\ b时创建边界条件的更改是非平凡的。如何从搜索和替换中排除“-cat”?所以最终的结果是:

:cat { --> :cat_tastic {
:catalog { --> no change
-cat { --> no change

这不一定是一行搜索和替换的一部分,它也可以是搜索和替换之前的条件,它控制是否执行搜索和替换,尽管在搜索和替换中将其执行最有用的。

2 个答案:

答案 0 :(得分:3)

这不是一个新手正则表达式,但它似乎最适合你的模式:使用“负面的lookbehind”表达,说“我想要我匹配的不是跟随连字符:

s/(?<!-)\bcat\b/cat_tastic/g

附录:这可以完成这项工作,但是更通用的方法(也可以移植到花哨的regexp语言更少)是将这类问题分成两部分:不是连字符之后的cat,或者字符串开头的cat:

s/([^-])\bcat\b|^\bcat\b/\1cat_tastic/g

或者更好:

s/([^-]|^)\bcat\b/\1cat_tastic/g

答案 1 :(得分:0)

如果您的案例中的“单词边界”与“az,AZ,0123456789以及下划线和连字符”一起出现,则可以使用字符类:

s/(?<![\w-])cat(?![\w-])/cat_tastic/g

字词边界\b出现在匹配\w的字符与另一个\w字符不相邻的位置。要添加连字符,最简单的方法是使用上面的字符类。