我刚开始学习模式匹配!
var stringToBeProcessed = "***???^^^^";
我必须检查此字符串是否仅包含[*,?,^]
此字符串不应连续5个问号或5星或5 ^ (但它们可以分布式存在)。 (即) * 或?????或^^^^^无效。
InValid测试用例:
** ????? * * ??? ^^ //问题重复连续5次,因此无效。
% * //存在[*,?,^]以外的符号。因此无效
编辑:
我使用string.Contains()方法检查上述模式。
我所做的就是:
string.contains("*****") || string.contains("^^^^^") || string.contains("?????") is true => is invalid
或
string.toCharArray().All(char => isCharIn(*,?,^)) is false => is invalid
上面的方法很糟糕,因为如果允许的符号变得很大,那么我的代码也变得庞大。任何优化但简单的例子? 也许是正则表达式中更好的方法?
答案 0 :(得分:2)
您可以使用这样的正则表达式:
^(([*?^])(?<!\2{5}))+$
\2
是back-reference,这意味着它将与先前在第二个捕获组(角色类)中匹配的内容完全匹配。 (?<!...)
就是所谓的negative lookbehind,这意味着它将拒绝前面的字符与给定模式匹配的任何字符串。
这将匹配*
,?
或^
字符的任何序列,只要它不包含5个相同字符的连续实例。
例如:
Regex.IsMatch("***???^^^^", @"^(([*?^])(?<!\2{5}))+$"); // true
Regex.IsMatch("***???^^^^^", @"^(([*?^])(?<!\2{5}))+$"); // false