【问题标题】:Regular expression to match only if there are N unique characters仅当有 N 个唯一字符时才匹配的正则表达式
【发布时间】:2013-12-09 10:13:43
【问题描述】:

有没有办法定义正则表达式,只有在至少有 N 个唯一字符时才匹配?

示例:(N = 3)

aba  => no match  
abc  => match
abbc => match
ab   => no match
abcd => match

【问题讨论】:

  • 这不是 RegEx 作业,更像是 Map-Reduce 作业。
  • 项目上使用了.NET(C#)
  • 你可以实现它,但它会非常慢。你真的不想这样做!

标签: .net regex


【解决方案1】:

不是真的,这不是正则表达式问题。

一个更简单的解决方案是使用像HashSet(T)这样的集合

  1. 将字符串拆分为字符并将每个字符添加到集合中。

  2. 统计集合中的元素个数。

【讨论】:

  • 我认为这是一个很好的方法,但要小心第 1 步。如果字符串是用户生成的,那么就有可能陷入 unicode 地狱。例如。 ë 和 e 应该被认为是同一个字符吗? ß应该被视为ss吗?将字符串拆分为“字符”有很多潜在问题。
  • 是的,但是这些问题是否不适用于在用户生成的字符串上使用正则表达式?
【解决方案2】:

使用regex 解决这些问题非常棘手。

既然问题被标记为 regex,你可以试试这个基于 lookahead 的正则表达式:

(.).*?((?!.*?\1).).*?((?!.*?\2).)
  • 首先这匹配任何字符并捕获组 #1 中的字符
  • 然后它在字符串中搜索任何不是组 #1 的字符并捕获组 #2 中的字符
  • 最后它在字符串中进一步搜索不是组#2的任何字符

在线演示:http://regex101.com/r/dH1rP4

不匹配:

  1. aba
  2. 啊啊啊啊
  3. aaaabbbb

匹配:

  1. abc
  2. adaac
  3. abbc
  4. adaaac
  5. 11112222220

【讨论】:

  • 此测试失败:/(.)((?!.*?\1).)((?!.*?\2).)/.test('adaaac'),即使其中包含三个唯一字符。
  • @mybrave:使用更新的示例查看更新的演示:regex101.com/r/aZ4aF1
  • 这个看起来很有前途!但同意这不是其他答案中写的正则表达式的常见任务。
  • 是的,我只是把它当作一个谜题,并创建了这个非常好的正则表达式。
  • 干得好,但我不明白为什么这与 aba 不匹配。 A是第一组,b与a不同,然后a与b不同。这似乎检查了第三组与 1 和 2,但你的描述和我的理解说它不应该是。
【解决方案3】:

已编辑

/(?:(.)(?!.*?\1).*){3}/

将 3 更改为所需的唯一字符值

PREEDIT - 仅用于文档并保持 cmets 的连贯性,这是发布的原始答案

/^(?:(.)(?!.*\1.*$)){3}$/

不,它不是 OP 所需要的,我误解了这个问题。此正则表达式测试字符串是否由指定数量的唯一字符组成。

【讨论】:

  • @sudo_O:你确定吗?未在 c# 上测试(此时我可以使用它)但在 javascript 中它可以工作。
  • 例如abbc 失败
  • @anubhava:不,它不会失败。没有3个唯一字符,唯一字符是ac
  • 我似乎匹配aba rubular.com/r/vgEMR0caLt,这是第一个和最后一个字符可以重复,当n=3 经过一些测试后它只检查相邻的字母不重复。
  • @MCND:查看此演示:regex101.com/r/zM1qH5 匹配 aba(无效)、abc(有效)但未能匹配同样有效的 abbc
猜你喜欢
  • 2019-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
相关资源
最近更新 更多