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