用于检测字符重复模式的正则表达式

问题描述 投票:0回答:1

我的问题与标题为“重复单词的正则表达式”的问题类似,但我有一些额外的要求。

    我需要包含其他字符。链接问题的接受答案仅检测由字母数字字符组成的单词,但我需要在单词的定义中包含符号字符,例如“@”。
  1. 我需要匹配模式的多次重复。如果一个单词重复三次,则链接问题的接受答案只会删除其中一个重复项,但我需要删除它们。
  2. 这是我用于测试的示例字符串:

hello hello me now now @@@ @@@ @@@ then method me @@@

我想要的结果是:

hello me now @@@ then method me @@@

    

regex vb.net duplicates expression
1个回答
0
投票

使用
    lookbehind
  1. 查找空白 (
  2. \s
  3. ) 和非空白 (
    \S
    )。
    
    
  4. 这是您需要的正则表达式:
/(?<=(\S+)\s+)\1\s+/g

这是一个

它的工作演示

这是演示的屏幕截图。

enter image description here

现在我将解释创建这个正则表达式的过程。首先,我们先明确一下目标。目标是匹配任何与前一个单词相同的单词,这样我们就可以
strip它

,即什么都不替换。那么让我们逐步完成整个过程:

第一步是匹配字符串中的每个单词。通常您会使用
    \w+
  1. ,但这仅匹配字母数字字符。相反,使用
    \S+
    匹配所有不被视为空白的字符。请注意,它匹配“@@@”以及普通单词。
    
    

enter image description here

第二步是仅匹配前面有另一个单词的单词。为此,我们使用lookbehind 表达式,查找后跟空格的单词。您可以在屏幕截图中看到字符串中的第一个单词不再匹配。完美。

enter image description here

第三步是仅匹配与其前面的单词相同的单词。为此,我们需要
    捕获
  1. 前面的单词(通过在lookbehind表达式内的\S+周围放置括号),然后
    refer
    到我们匹配中捕获的组(用\S+替换我们原来的
    \1
    )。
    
    

enter image description here

请注意上面的屏幕截图,在删除匹配项(将其替换为空)后,我们仍然留下一些额外的空格。我们可以通过在原始匹配表达式中的单词后面包含任何空格来避免这些问题,因此我们只需在其末尾添加
    \s+
  1. 即可。这给我们带来了最终结果,我在本答案开头对此进行了说明。
    
    
/(?<=(\S+)\s+)\1\s+/g

    

© www.soinside.com 2019 - 2024. All rights reserved.