【问题标题】:regex pattern to find word repetition between two specific words正则表达式模式来查找两个特定单词之间的单词重复
【发布时间】:2014-05-05 21:01:18
【问题描述】:

我可以使用(.+)(?=\1+) 找到给定句子的重复模式。但是当我在一个句子中的两个特定单词之间尝试相同时,它会因为“不匹配”而失败。

我在这里错过了什么吗?

例子:

abc def def def def ghi ghi xyz

当我使用/abc (.+)(?=\1+) xyz/ 时,它会因不匹配而失败。

不想在任何条件括号下添加第一个单词和第二个单词。 所以我希望正则表达式语句属于这种类型 /abc 正则表达式 def/

【问题讨论】:

  • 具体是哪两个词?
  • 你用什么模式来匹配特定的词?
  • 我使用 /abc (.+)(?=\1+) def/ 来查找 abc 和 def 之间的重复
  • 啊。请编辑您的问题以反映这一点。

标签: regex perl


【解决方案1】:

针对您的修改,您第一次使用的模式不起作用,因为 (1) 您没有正确考虑空格,(2) 您过度指定匹配段的开始和结束位置,以及(3) 你并没有真正正确地使用前瞻功能。下面是更深入的解释:

  • 通过指定模式介于abcdef 之间,您可以将可匹配的子字符串限制为def def defdef defdef
  • 大概是想匹配上面三个要匹配的选项中的第一个。但请注意,因为您的第二组是前瞻,所以第一组必须匹配 整个子字符串
  • 前瞻意味着紧接在前瞻原子之后的字符串与前瞻原子匹配。所以你的模式表明def 必须匹配\1+。但def 以空格开头,因此无法匹配上述任何字符串(def def defdef defdef)。

您似乎实际上试图做的是指定字符串的匹配段应该前面加上单词abc 用词def。在这种情况下,只需使用后向和前瞻:

/(?<=\babc\b).*?(\w+)\W+(\1\b\W*)+.*?(?=\bdef\b)/

我摆脱了你原来的前瞻;您想要的匹配项(即重复的单词)在第一个捕获组中(即变量 $1)。请注意,除了\b“单词边界”零宽度原子之外,我还使用\w\W 来区分单词和非单词字符。

编辑:前瞻/后瞻实际上是不必要的。由于您想使用没有它们的模式,因此这是您想要的版本:

/\babc\b.*?(\w+)\W+(\1\b\W*)+.*?\bdef\b/

【讨论】:

  • 我不认识 def ffront 这个词。我需要找到这个词
  • @user3605127 .....那么为什么它在你的模式中?我很难准确理解你想要做什么。
  • @user3605127 我已经编辑了答案的第二部分,以创建一个模式,我认为可以满足你的要求,假设你真的想找到重复的单词 abcdef这两个词之间。
  • 如果您想找到defxyz 之间的重复单词,您可以将模式的开头更改为(?&lt;=\bdef\b),将结尾更改为(?=\bxyz\b),并且匹配后$1 将设置为字符串ghi
  • Kyle,有没有办法在这种条件括号中不指定 abc 和 def 单词。
猜你喜欢
  • 1970-01-01
  • 2017-02-03
  • 2022-08-18
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
  • 2020-06-09
相关资源
最近更新 更多