替换特定单词模式

时间:2015-04-29 13:01:45

标签: ruby regex replace regex-negation replaceall

对于像

这样的给定文字
  

pack:我的盒子里有五个:打:酒:jugs ::::

我想将所有:替换为仅在单词ack和zen之后出现的;。所以我期望的输出是

  

包装:我的盒子有五个;打:酒;水壶;;; ;

请注意,ack和zen之后的:不受影响,而其他所有内容都会被替换。

请帮帮我。我只能匹配(ack|zen):。这只是给我匹配ack:zen:。我不知道如何否定这一点并构建一个正则表达式。

注意:我使用的是Ruby。

4 个答案:

答案 0 :(得分:2)

使用负面lookbehind进行替换。

搜索:

(?<!ack|zen):

替换为:

;

RegEx Demo

(?<!ack|zen):是一个负面的lookbehind,这意味着仅当冒号前面没有ackzen时才匹配冒号。

答案 1 :(得分:2)

Regular-Expressions所述,你需要一个后视镜。

这有效:

(?<=(ack|zen)):

您可以在此处测试:https://www.debuggex.com/

答案 2 :(得分:1)

您可以使用带有两个固定字符串的负向lookbehind:

(?<!ack|zen):

为简化正则表达式引擎工作,您也可以测试它:

:(?<!ack:|zen:)

(使用最后一个模式,lookbehind的两个分支仅在带有连字符的位置进行测试,而不是针对第一个模式的字符串中的每个位置进行测试。)

答案 3 :(得分:1)

您可以在此处使用否定后视并使用gsub

puts "pack: my box with five: dozen: liquor: jugs ::: :".gsub(/(?<!ack|zen):/, ";")

IDEONE DEMO

结果:

pack: my box with five; dozen: liquor; jugs ;;; ;

你可以在这里使用后卫,因为两个部分的大小相同(3个字符)。