Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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
c#正则表达式只匹配任意顺序的字符集一次_C#_Regex - Fatal编程技术网

c#正则表达式只匹配任意顺序的字符集一次

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),请使用此正则表达式

我需要以任何顺序匹配集合中的任何字符组合,但不能重复字符。集合是“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
),请使用此正则表达式

^(?!.*(.)\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]