正则表达式将整个单词与单词的特定定义相匹配

时间:2012-02-17 13:38:32

标签: regex

我正在进行文件搜索并替换perl中特定单词的出现。我通常不是perl或regex用户。我在这里搜索了其他正则表达式的问题,但我找不到一个非常正确的问题所以我正在寻求帮助。我的搜索和替换目前看起来像这样:

s/originalword/originalword_suffix/g

这匹配出现在另一个单词中间的原始词的情况,这是我不想要的。在我的搜索和替换应用中,整个单词可以定义为拉丁字母的字母为小写或大写字母,数字0-9和符号_为任何不间断的序列。除了这些字符之外的任何其他内容,包括任何其他符号或任何形式的空格,包括换行符或制表符,都表示某种操作或分隔符,因此它们位于单词边界之外。如何修改我的搜索并将其替换为仅匹配整个单词,因为我已定义它们,而不匹配子字符串?

示例:

在originalword = cat和originalword_suffix = cat_tastic

的情况下
:cat { --> :cat_tastic {
:catalog { --> no change

3 个答案:

答案 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.