在询问this perl newbie question后,我有一个perl新手跟进。我发现了一个案例,其中使用单词boundary失败了我的应用程序,它执行此正则表达式搜索并替换一组文件:
s/\bcat\b/cat_tastic/g
我还希望-cat不能替换匹配,尽管它目前是匹配的,因为连字符被认为是单词边界。我已经阅读了单词边界,但我学到的是在使用\ b时创建边界条件的更改是非平凡的。如何从搜索和替换中排除“-cat”?所以最终的结果是:
:cat { --> :cat_tastic {
:catalog { --> no change
-cat { --> no change
这不一定是一行搜索和替换的一部分,它也可以是搜索和替换之前的条件,它控制是否执行搜索和替换,尽管在搜索和替换中将其执行最有用的。
答案 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
字符不相邻的位置。要添加连字符,最简单的方法是使用上面的字符类。