【问题标题】:Regex Ignore Proceeding Words正则表达式忽略进行中的单词
【发布时间】:2014-04-12 01:42:37
【问题描述】:

我正在尝试创建一个以某个单词开头并忽略任何其他相同的后续单词的正则表达式。

例如,如果我的字符串以单词“dog”开头并以“fish”结尾,我如何忽略任何继续的“dog”单词而只匹配最后一个?

狗猫鱼

dog dog cat fish

dog dog dog cat fish

【问题讨论】:

  • 你有没有可能有一个字符串,比如dog dog dog cat fish dog dog fish cat
  • 开头的单词有哪些限制,可以重复也可以不重复?例如总是3个字母吗?它是字典里的一个词吗? (你会如何解决 Do from Dog?)它总是“狗”吗?

标签: regex


【解决方案1】:

以下regex 有效:

(\b\w+\b |\b\w+\b$)(?!\1) 启用了 mg 标志

演示:http://regex101.com/r/dW9fP5

根据您的新要求:

(\b\w+\b|\b\w+\b$)(?!\1) 启用了 mg 标志

【讨论】:

  • 这也有效:(\b\w+) (?!\1).*regex101.com/r/uM9zH7。或者更准确地说:(\b\w+) (?!\1)(?:\w+ )*\w+$:regex101.com/r/jM1zY2
  • 哇,感谢您的快速响应!有没有办法让我在没有空格的情况下让它工作?忽略最后一个“狗”字之后的任何“狗”字?比如dogdogcatfish
  • @user3525737,你是什么意思?您的字符串不是由空格分隔?
  • 是的,当我最初发布时,我忘了提到它们没有用空格分隔(一个长字符串)。到目前为止,我感谢您的帮助:D。
  • @user3525737:请注意在原始问题中发布所有相关信息。这种“第六感”类型的问题(最后会改变一切)可能会非常令人沮丧。
【解决方案2】:

去除空格分隔的重复项:

狗狗猫鱼

(?>(\w+) (?=\1\b))+

测试地址:regex101eval.in(如果是 php)

使用lookahead 检查第一个括号组的匹配是否在前面(前面有一个空格)。


要仅在字符串开头匹配重复项,请在开头添加 ^ anchor

狗狗狗猫猫鱼

^(?>(\w+) (?=\1\b))+

test at regex101


编辑:问题显然已更改为匹配一个长字符串中的连续字符序列而没有空格。对模式进行了一些修改,以在开始时去除至少 3 个字符的序列:

dogdogdogcatcatfish

^(?>(\w{3,})(?=\1))+

test at regex101


替换为空字符串""

Regex FAQ

【讨论】:

    【解决方案3】:

    这是一个简单的(文字)模式:

    .*(dog)
    

    替换模式:

    \1 
    

    不是最令人兴奋的,但不妨展示一下。括号中的目标词设置为匹配组\1

    示例:http://regex101.com/r/yU6xO8

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 2023-03-04
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多