c#regex只按任意顺序匹配一组字符

时间:2017-04-19 14:26:42

标签: 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)

我用这个测试仪 http://regexstorm.net/tester

这是最接近但不会捕获所有订单组合

^(?:[m]{1})|(?:[n]{1})$

例如,不会捕获nm。

感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:1)

如果不允许连续重复(例如在NSString *labelText = @"My String"; NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:labelText]; NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; [paragraphStyle setLineSpacing:20]; [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [labelText length])]; cell.label.attributedText = attributedString ; 中),请使用此正则表达式

mmft

演示:https://regex101.com/r/11pGQB/1

如果不允许任何字符重复发生(例如在^(?!.*(.)\1)[msbrelft]+$ 中),请使用:

mftm

演示:https://regex101.com/r/q1bpMr/1

两个正则表达式中的关键点是重复检查lookbehind:

  • 在第一种情况下(^(?!.*(.).*\1)[msbrelft]+$ ),如果有一个字符紧跟其自身(^(?!.*(.)\1)),则匹配失败。

  • 在第二种情况((.)\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;
}