【问题标题】:Regex to match whole word with a particular definition of a word正则表达式将整个单词与单词的特定定义匹配
【发布时间】:2012-02-17 13:38:32
【问题描述】:

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

s/originalword/originalword_suffix/g

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

例子:

在 originalword = cat 和 originalword_suffix = cat_tastic 的情况下

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

【问题讨论】:

  • 您的意思是“全词”选项?

标签: regex


【解决方案1】:

使用 \b 锚点仅匹配单词边界:

s/\bcat\b/cat_tastic/g

虽然 Perl 对“单词”的定义略有不同。多次阅读 perlre 参考指南可能会帮助您更好地理解正则表达式。

在终端中运行 perl -pi -e "YOUR_REGEXP" 并输入文本行可以帮助您理解和调试特定的正则表达式正在做什么。

【讨论】:

  • 感谢您的回答和指向文档的指针,这让我走上了正轨。
  • @TimPotter 但是为什么\b[-|+][0-9]+\b 匹配+10 在43E+10。
【解决方案2】:

你可以试试:

s/([^0-9a-z_])([0-9a-z_]+)([^0-9a-z_])/$1$2_tastic$3/gi

基本上是一个非单词字符,然后是一组单词字符,然后是一个非单词字符。 $1,$2,$3 代表捕获的组,您将 $2 替换为 $2_suffix。

希望对您有所帮助,而不是 perl 人购买相当精通正则表达式的人。请注意,如果单词是字符串中的第一个或最后一个单词,则上述操作将失败。不确定 perl regexen 是否允许该语法,但如果是,则可以通过以下方式修复第一个/最后一个问题:

s/(^|[^0-9a-z_])([0-9a-z_]+)([^0-9a-z_]|$)/$1$2_tastic$3/gi

使用 ^ 和 $ 匹配字符串的开头/结尾。

【讨论】:

    【解决方案3】:

    请参阅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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-10
      • 2010-11-15
      • 2012-01-06
      • 1970-01-01
      • 2019-09-29
      相关资源
      最近更新 更多