我需要找到字符串中最后一个单词的出现(并替换它)。所以在下面的句子中,我会寻找第二个"巧克力"。
我喜欢牛奶巧克力,但我讨厌白色巧克力。
如何通过正则表达式实现这一目标?你能给我一些解释吗? 感谢。
答案 0 :(得分:3)
如果你想使用正则表达式,你可以使用这样的东西:
(.*)chocolate
替换字符串将是:
$1banana
^-- whatever you want
<强> working demo 强>
在 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.
$