模式匹配c#中的预定义集

时间:2013-11-11 07:02:43

标签: c# regex .net-4.0

我刚开始学习模式匹配!

var stringToBeProcessed = "***???^^^^";
  1. 我必须检查此字符串是否仅包含[*,?,^]

  2. 此字符串不应连续5个问号或5星或5 ^ (但它们可以分布式存在)。 (即) * 或?????或^^^^^无效。

    InValid测试用例:

  3. ** ????? * * ??? ^^ //问题重复连续5次,因此无效。

    * //存在[*,?,^]以外的符号。因此无效

    编辑:

    我使用string.Contains()方法检查上述模式。

    我所做的就是:

    string.contains("*****") || string.contains("^^^^^") || string.contains("?????") is true => is invalid
    

    string.toCharArray().All(char => isCharIn(*,?,^)) is false => is invalid
    

    上面的方法很糟糕,因为如果允许的符号变得很大,那么我的代码也变得庞大。任何优化但简单的例子? 也许是正则表达式中更好的方法?

1 个答案:

答案 0 :(得分:2)

您可以使用这样的正则表达式:

^(([*?^])(?<!\2{5}))+$

\2back-reference,这意味着它将与先前在第二个捕获组(角色类)中匹配的内容完全匹配。 (?<!...)就是所谓的negative lookbehind,这意味着它将拒绝前面的字符与给定模式匹配的任何字符串。

这将匹配*?^字符的任何序列,只要它不包含5个相同字符的连续实例。

例如:

Regex.IsMatch("***???^^^^", @"^(([*?^])(?<!\2{5}))+$");    // true
Regex.IsMatch("***???^^^^^", @"^(([*?^])(?<!\2{5}))+$");   // false