我需要以任何顺序匹配集合中的任何字符组合,但不能重复字符。该集合是“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。
感谢任何帮助,谢谢。
答案 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;
}