c#正则表达式只匹配任意顺序的字符集一次
我需要以任何顺序匹配集合中的任何字符组合,但不能重复字符。集合是“m,s,b,r,e,l,f,t”,例如c#正则表达式只匹配任意顺序的字符集一次,c#,regex,C#,Regex,我需要以任何顺序匹配集合中的任何字符组合,但不能重复字符。集合是“m,s,b,r,e,l,f,t”,例如 msb - valid mbs - valid m - valid mmft - not valid (duplicate m) mxel - not valid (x is not in set) 我用这个测试仪 这是最接近的,但不会捕获所有订单组合 ^(?:[m]{1})|(?:[n]{1})$ 例如,不会捕获nm 感谢您的帮助。如果不允许连续重复(如mmft),请使用此正则表达式
msb - valid
mbs - valid
m - valid
mmft - not valid (duplicate m)
mxel - not valid (x is not in set)
我用这个测试仪
这是最接近的,但不会捕获所有订单组合
^(?:[m]{1})|(?:[n]{1})$
例如,不会捕获nm
感谢您的帮助。如果不允许连续重复(如
mmft
),请使用此正则表达式
^(?!.*(.)\1)[msbrelft]+$
演示:
如果不允许任何字符重复出现(如在mftm
中),请使用以下命令:
^(?!.*(.).*\1)[msbrelft]+$
演示:
这两个正则表达式中的关键点是递归检查查找:
- 在第一种情况下(
),如果有一个字符紧跟在其后面(^(?。*()\1)
),则匹配失败()\1
- 在第二种情况下(
),如果有字符在其他序列(^(?。*()..\1)
)之后重复,则匹配失败().\1
private bool IsMatch(string str) {
HashSet<char> set = new HashSet<char>("msbrelft"),
viewed = new HashSet<char>();
foreach (var c in str) {
if (!set.Contains(c)) return false;
if (viewed.Contains(c)) return false;
viewed.Add(c);
}
return true;
}
private bool IsMatch(字符串str){
HashSet set=新的HashSet(“msbrelft”),
查看=新的HashSet();
foreach(str中的var c){
如果(!set.Contains(c))返回false;
如果(查看包含(c))返回false;
添加(c);
}
返回true;
}
您是否在C代码中使用正则表达式?我建议您使用^[msbrelft]+$
获取所有匹配项,然后过滤掉包含重复字符的匹配项。“重复”是指多个字符,还是指多个连续字符?我只是暂时测试一下,但计划验证一个字符串,以便欢迎任何解决方案。没有组,只有一个letter@Wiktor,您的建议将允许重复的字母我接受这一点,因为简单(HashSet)。谢谢你。也谢谢你,我测试了第二组和第二组。然而,我必须进一步测试是否不包括在捕获的组中。看来第一个答案比较容易,谢谢你的努力@迪米特里,再次感谢你!我在另一个验证中包含了您的第2个解决方案,我尝试匹配,并使用了^(.|\n)*()(.|\n)*$。但是你的解决方案很棒@user1734108:不客气!顺便说一句,当需要按字面意思进行匹配时,不要忘记转义方括号,即
。此外,在方括号中定义字符类时不应使用管道(|
),因为它在括号中按字面意思处理。也就是说,在您的情况下,使用[msbrelft]
而不是[m | s | b | r | e | l | f | t]
。