我正在进行文件搜索并替换perl中特定单词的出现。我通常不是perl或regex用户。我在这里搜索了其他正则表达式的问题,但我找不到一个非常正确的问题所以我正在寻求帮助。我的搜索和替换目前看起来像这样:
s/originalword/originalword_suffix/g
这匹配出现在另一个单词中间的原始词的情况,这是我不想要的。在我的搜索和替换应用中,整个单词可以定义为拉丁字母的字母为小写或大写字母,数字0-9和符号_为任何不间断的序列。除了这些字符之外的任何其他内容,包括任何其他符号或任何形式的空格,包括换行符或制表符,都表示某种操作或分隔符,因此它们位于单词边界之外。如何修改我的搜索并将其替换为仅匹配整个单词,因为我已定义它们,而不匹配子字符串?
示例:
在originalword = cat和originalword_suffix = cat_tastic
的情况下:cat { --> :cat_tastic {
:catalog { --> no change
答案 0 :(得分:2)
使用\ b锚点仅匹配单词边界:
s/\bcat\b/cat_tastic/g
虽然Perl对“单词”的定义略有不同。阅读perlre参考指南几次可能会帮助您更好地理解regexp。
在终端中运行perl -pi -e“YOUR_REGEXP”并输入文本行可以帮助您理解和调试特定正则表达式正在做什么。
答案 1 :(得分:0)
你可以尝试:
s/([^0-9a-z_])([0-9a-z_]+)([^0-9a-z_])/$1$2_tastic$3/gi
基本上是非单词字符,然后是一组单词字符,后跟非单词字符。 $ 1,$ 2,$ 3代表捕获的组,你用$ 2_suffix替换2美元。
希望有所帮助,而不是perl家伙购买漂亮的正则表达式。请注意,如果单词是字符串中的第一个或最后一个,则上述操作将失败。不确定perl regexen是否允许语法,但如果是这样,修复第一个/最后一个问题可以通过以下方式完成:
s/(^|[^0-9a-z_])([0-9a-z_]+)([^0-9a-z_]|$)/$1$2_tastic$3/gi
使用^和$匹配字符串的开头/结尾。
答案 2 :(得分:0)
请参阅this page上解释边界匹配器的示例
Enter your regex: \bdog\b
Enter input string to search: The dog plays in the yard.
I found the text "dog" starting at index 4 and ending at index 7.
Enter your regex: \bdog\b
Enter input string to search: The doggie plays in the yard.
No match found.