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

Replace all colon character that does not occur after specific word pattern

对于给定的文本,例如

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

我想用只出现在 ack 和 zen 之后的 ; 替换所有 :。所以我在这里期望的输出是

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

请注意 : 在 ack 和 zen 保持不变而其他所有内容都被替换之后。

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

注意:我正在使用 Ruby。

使用负后视进行替换。

搜索:

(?<!ack|zen):

替换为:

;

RegEx Demo

(?<!ack|zen): 是一个负向后视,这意味着只有当冒号前面没有 ackzen.

时才匹配冒号

您需要回顾一下 Regular-Expressions 中的说明。

这个有效:

(?<=(ack|zen)):

您可以在这里进行测试:https://www.debuggex.com/

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

(?<!ack|zen):

为了简化正则表达式引擎的工作,你也可以测试一下:

:(?<!ack:|zen:)

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

你可以在这里使用负面回顾并使用 gsub:

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

IDEONE DEMO

结果:

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

您可以在此处使用后视,因为两个部分的大小相同(3 个字符)。