Ruby 替换特定单词模式后未出现的所有冒号字符

Ruby 替换特定单词模式后未出现的所有冒号字符,ruby,regex,replace,regex-negation,replaceall,Ruby,Regex,Replace,Regex Negation,Replaceall,对于给定的文本,如 包装:我的盒子里有五:打:酒:壶: 我想用替换所有:仅出现在单词ack和zen之后。因此,我希望这里的输出是 包装:我的盒子里有五个;打:酒;水壶 请注意,:在ack和zen之后是不变的,而其他所有内容都被替换 请帮帮我。我只能匹配(ack | zen):。这只是给我匹配的ack:和zen:。我不知道如何否定这一点并构造正则表达式 注意:我使用的是Ruby。使用反向查找进行替换 搜索: (?<!ack|zen): (?是一个负回溯,这意味着仅当冒号前面没有ack或z

对于给定的文本,如

包装:我的盒子里有五:打:酒:壶:

我想用
替换所有
仅出现在单词ack和zen之后。因此,我希望这里的输出是

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

请注意,
在ack和zen之后是不变的,而其他所有内容都被替换

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


注意:我使用的是Ruby。

使用反向查找进行替换

搜索:

(?<!ack|zen):


(?是一个负回溯,这意味着仅当冒号前面没有
ack
zen
时才匹配冒号。使用负回溯进行替换

搜索:

(?<!ack|zen):


(?是一个负数lookback,意思是仅当冒号前面没有
ack
zen
时才匹配冒号。您需要一个lookback,如中所述

这项工作:

(?<=(ack|zen)):

(?如中所述,您需要查找

这项工作:

(?<=(ack|zen)):

(?您可以使用带有两个固定字符串的反向查找:

(?<!ack|zen):
(?
为了简化正则表达式引擎的工作,您也可以对其进行测试:

:(?<!ack:|zen:)
:(?

(对于最后一个模式,只能在带有连字符的位置测试lookback的两个分支,而不是在第一个模式的字符串中的每个位置进行测试。)

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

(?<!ack|zen):
(?
为了简化正则表达式引擎的工作,您也可以对其进行测试:

:(?<!ack:|zen:)
:(?

(对于最后一个模式,只能在带有连字符的位置测试lookback的两个分支,而不是在第一个模式的字符串中的每个位置进行测试。)

您可以在此处使用反向lookback并使用
gsub

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

您可以在此处使用后视镜,因为两个零件的尺寸相同(3个字符)。

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

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

您可以在此处使用“向后看”,因为这两个部分的大小相同(3个字符).

你用的是什么语言?我不熟悉Ruby,但只需简单的谷歌搜索:
句子.gsub!ack:“,”ack;“
应该有效:/我想我问错了,看看编辑你用的是什么语言?我不熟悉Ruby,但只需简单的谷歌搜索:
句子.gsub!ack:“,”应该有效:
我想我问了问题错了,请看编辑对不起,我编辑了问题。我需要与我所问的相反的答案。对不起,我编辑了问题。我需要与我所问的相反的答案。又好又快,但是,我不会在后面看中设置捕获组,这是额外的不必要的开销。我重新格式化了答案,使其看起来更好。但是,又好又快,我会ld没有在look back中设置捕获组,这是额外的不必要的开销。我重新格式化了答案以使其看起来更好。