Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 仅当有N个唯一字符时才匹配的正则表达式_.net_Regex - Fatal编程技术网

.net 仅当有N个唯一字符时才匹配的正则表达式

.net 仅当有N个唯一字符时才匹配的正则表达式,.net,regex,.net,Regex,有没有一种方法可以定义只有在至少有N个唯一字符时才会匹配的正则表达式 示例:(N=3) 使用regex处理这些问题相当棘手 由于问题被标记为regex,您可以尝试使用基于的前瞻性regex: (.).*?((?!.*?\1).).*?((?!.*?\2).) 首先,它匹配任何字符并捕获组#1中的字符 然后,它在字符串中搜索非组#1的任何字符,并在组#2中捕获该字符 最后,它会在字符串中进一步搜索非group#2的任何字符 在线演示: 它不匹配: 阿巴 阿达拉 aaaabbbb 它匹配: a

有没有一种方法可以定义只有在至少有N个唯一字符时才会匹配的正则表达式

示例:(N=3)


使用
regex
处理这些问题相当棘手

由于问题被标记为
regex
,您可以尝试使用基于
的前瞻性regex:

(.).*?((?!.*?\1).).*?((?!.*?\2).)
  • 首先,它匹配任何字符并捕获组#1中的字符
  • 然后,它在字符串中搜索非组#1的任何字符,并在组#2中捕获该字符
  • 最后,它会在字符串中进一步搜索非group#2的任何字符
在线演示:

它不匹配:

  • 阿巴
  • 阿达拉
  • aaaabbbb
  • 匹配:

  • abc
  • 亚达克
  • abbc
  • 阿达克
  • 11112222220

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

    一个更简单的解决方案是使用一组

  • 将字符串拆分为个字符,并将每个字符添加到集合中

  • 计算集合中的元素数

  • 编辑

    使用所需的唯一字符值更改3

    PREEDIT-仅用于文档和保持评论的一致性,这是发布的原始答案

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

    不,这不是OP需要的,我误解了这个问题。此regexp测试字符串是否仅由指定数量的唯一字符组成。

    这不是一个RegEx作业,更像是Map Reduce作业。项目(C#)中使用了.NET。您可以实现它,但速度非常慢。你真的不想这么做!此测试失败:
    /()(?!.\1)。(?!.\2)。/.test('adaaac')
    ,即使其中有三个唯一的字符。@mybrave:请参阅更新的演示和更新的示例:这一个看起来很有希望!但我同意这不是其他答案中所写的正则表达式的常见任务。是的,我只是把它当作一个谜题,创建了这个正则表达式,结果非常好。做得很好,但我不明白为什么它与aba不匹配。A是第一组,b不同于A,然后A不同于b。这似乎可以将第三组与第1组和第2组进行比较,但您的描述和我的理解都表明不应该如此。@sudo\u O:您确定吗?未在c#上测试(目前我可以使用它),但在javascript中它可以工作。阿努巴瓦:不,它没有失败。没有3个唯一的字符,只有唯一的字符是
    a
    c
    我似乎匹配
    aba
    ,当
    n=3
    经过一些测试后,第一个和最后一个字符可以重复。@MCND:查看此演示:匹配了
    aba
    (无效),
    abc
    (有效)但是,这是一个很好的方法,但是要小心第1步。如果字符串是用户生成的,那么就有可能下降到Unicode地狱中。例如,应该把E和E看作同一个字符吗?是否应该被认为是SS?但这些问题是否不适用于在用户生成的字符串上使用正则表达式?
    /(?:(.)(?!.*?\1).*){3}/
    
    /^(?:(.)(?!.*\1.*$)){3}$/