【问题标题】:Replace all colon character that does not occur after specific word pattern替换特定单词模式后未出现的所有冒号字符
【发布时间】:2015-04-30 03:43:59
【问题描述】:

对于给定的文本,如

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

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

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

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

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

注意:我正在使用 Ruby。

【问题讨论】:

  • 你使用什么语言?
  • 我不熟悉 Ruby,但一个简单的谷歌搜索:sentence.gsub! 'ack:', 'ack;' 应该可以工作:/
  • 我想我问错了问题,请参阅编辑

标签: ruby regex replace regex-negation replaceall


【解决方案1】:

使用否定的lookbehind进行替换。

搜索:

(?<!ack|zen):

替换为:

;

RegEx Demo

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

【讨论】:

  • 对不起,我编辑了这个问题。我需要与我所问的相反。
【解决方案2】:

您需要按照Regular-Expressions 的说明进行回顾。

这行得通:

(?<=(ack|zen)):

你可以在这里测试它:https://www.debuggex.com/

【讨论】:

  • 又好又快,但是,我不会在后视中设置捕获组,这是额外的不必要的开销。我重新格式化了答案以使其看起来更好。
【解决方案3】:

您可以在此处使用否定的look-behind 并使用gsub

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

IDEONE DEMO

结果:

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

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

【讨论】:

    【解决方案4】:

    您可以使用带有两个固定字符串的否定回溯:

    (?<!ack|zen):
    

    为了简化正则表达式引擎的工作,您也可以对此进行测试:

    :(?<!ack:|zen:)
    

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

    【讨论】:

      猜你喜欢
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 2023-03-26
      • 1970-01-01
      • 2012-05-20
      • 2011-11-26
      相关资源
      最近更新 更多