1

我刚开始学习模式匹配!

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

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

    无效的测试用例:

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

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

编辑:

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

我所做的只是:

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

或者

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

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

4

1 回答 1

2

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

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

\2是一个反向引用,这意味着它将完全匹配之前在第二个捕获组(字符类)中匹配的内容。这(?<!...)就是所谓的否定后视,这意味着它将拒绝前面字符与给定模式匹配的任何字符串。

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

例如:

Regex.IsMatch("***???^^^^", @"^(([*?^])(?<!\2{5}))+$");    // true
Regex.IsMatch("***???^^^^^", @"^(([*?^])(?<!\2{5}))+$");   // false
于 2013-11-11T07:07:34.313 回答