对于像
这样的给定文字pack:我的盒子里有五个:打:酒:jugs ::::
我想将所有:
替换为仅在单词ack和zen之后出现的;
。所以我期望的输出是
包装:我的盒子有五个;打:酒;水壶;;; ;
请注意,ack和zen之后的:
不受影响,而其他所有内容都会被替换。
请帮帮我。我只能匹配(ack|zen):
。这只是给我匹配ack:
和zen:
。我不知道如何否定这一点并构建一个正则表达式。
注意:我使用的是Ruby。
答案 0 :(得分:2)
使用负面lookbehind进行替换。
搜索:
(?<!ack|zen):
替换为:
;
(?<!ack|zen):
是一个负面的lookbehind,这意味着仅当冒号前面没有ack
或zen
时才匹配冒号。
答案 1 :(得分:2)
答案 2 :(得分:1)
您可以使用带有两个固定字符串的负向lookbehind:
(?<!ack|zen):
为简化正则表达式引擎工作,您也可以测试它:
:(?<!ack:|zen:)
(使用最后一个模式,lookbehind的两个分支仅在带有连字符的位置进行测试,而不是针对第一个模式的字符串中的每个位置进行测试。)
答案 3 :(得分:1)
您可以在此处使用否定后视并使用gsub
:
puts "pack: my box with five: dozen: liquor: jugs ::: :".gsub(/(?<!ack|zen):/, ";")
结果:
pack: my box with five; dozen: liquor; jugs ;;; ;
你可以在这里使用后卫,因为两个部分的大小相同(3个字符)。