正则表达式:在字符串中查找最后出现的单词

时间:2015-04-15 20:14:33

标签: regex unix

我需要找到字符串中最后一个单词的出现(并替换它)。所以在下面的句子中,我会寻找第二个"巧克力"。

  

我喜欢牛奶巧克力,但我讨厌白色巧克力

如何通过正则表达式实现这一目标?你能给我一些解释吗? 感谢。

3 个答案:

答案 0 :(得分:3)

如果你想使用正则表达式,你可以使用这样的东西:

(.*)chocolate

替换字符串将是:

$1banana
  ^-- whatever you want

<强> working demo

enter image description here

Lucas 的评论中指出

更新,您可以使用以下方法改进正则表达式:

(.*)\bchocolate\b

这可以避免像chocolateeejojo

这样的误报

答案 1 :(得分:0)

PCRE看起来像这样:

/^(.*)chocolate/$1replace/sm

答案 2 :(得分:0)

如果您想匹配任何不同单词的第二次出现,您可以使用反向引用,具体取决于您所使用的语言和正则表达式。

例如,在sed中,您可以执行以下操作:

sed 's/\(.*\([[:<:]][[:alpha:]]*[[:>:]]\).*\)\(\2\)\(.*\)/\1russians\4/'

打破这个以便于阅读,看起来像这样:

  • s/ - 在sed中替换
  • \(.*\([[:<:]][[:alpha:]]*[[:>:]]\).*\)\(\2\)\(.*\) - 搜索RE。不是那么复杂......
    • [[:<:]][[:>:]]是可移植的字边界,
    • [[:alpha:]]是按字母顺序排列的字符(单词)
    • \(\)环绕原子用于反向引用,在BRE中(这是sed,请记住)
  • \1russians\4 - 替换字符串由RE的第一个(外部)带括号的反向引用组成,后跟替换字,后跟尾随字符。

例如:

$ t="I love milk chocolate but I hate white chocolate."
$ sed 's/\(.*\([[:<:]][[:alpha:]]*[[:>:]]\).*\)\(\2\)\(.*\)/\1russians\4/' <<<"$t"
I love milk chocolate but I hate white russians.
$ t="In a few years, your twenty may be worth twenty bucks."
$ sed 's/\(.*\([[:<:]][[:alpha:]]*[[:>:]]\).*\)\(\2\)\(.*\)/\1fifty\4/' <<<"$t"
In a few years, your twenty may be worth fifty bucks.
$