是否可以匹配仅使用regxp出现多次的宽字符?

时间:2014-12-14 16:00:02

标签: regex

例如,在此字符串中没有\s

abodnpjdcqe

只应匹配d。 但在我的情况下有数千个不同的字符,是否可以使用ONLY regxp来匹配字符串中出现的所有字符多次?似乎所有其他问题都使用其他工具。

2 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式:

([a-zA-Z])(?=.*\1)

说明:

  • 正则表达式使用([a-zA-Z])匹配任何字母并将其捕获为group #1,即\1
  • 肯定前瞻性(?=.*\1)确保此匹配成功,然后至少有一个后向引用\1,即字符本身。

RegEx Demo

答案 1 :(得分:1)

当anubhava演示它时,可以找到字符串中出现两次的字符,而且我没有看到任何其他正则表达式模式。

但是,只有正则表达式存在问题:

  1. 这种模式的复杂性非常高,如果您的字符串很长且重复很少,您将遇到问题(回溯限制和执行时间)。
  2. 这种方式无法查看是否已找到重复的字符。例如字符串a123a456a789a,模式将返回a三次而不是一次。如果您的目标是获取唯一重复字符列表,则可能会出现问题(但很容易以编程方式解决)
  3. 所以,回答你的问题:我的回答是否定的。

    一个简单的方法,使用代码来循环遍历字符串的字符并构建一个关联数组,其中键是字符,值是出现次数。然后,删除值为1的每个项目并提取密钥。

    注意:您可以使用此模式解决重复结果(2。)的问题:

    (.)(?=(?:(?!\1).)*\1(?:(?!\1).)*$)
    

    或者是否有占有量词:

    (.)(?=(?:(?!\1).)*+\1(?:(?!\1).)*+$)
    

    但我担心复杂性会更高。

    所以,用最喜欢的语言保持最好的方式。