Regex.Matches跳过了一个匹配? c#

3

我需要识别字符串中的子字符串,例如:

"CityABCProcess Test" 或者 "cityABCProcess Test"

应该返回:

[ "City/city", "ABC", "Process", "Test" ]

  1. 子字符串中的第一个字符串可以是小写或大写字母。
  2. 任何包含重复大写字母的子字符串都是一个子字符串,直到找到小写字母或空格为止。例如:"ABCProcess" -> "ABC","ABC Process" -> "ABC"。
  3. 如果有一个大写字母后跟着一个小写字母,则子字符串将是直到下一个大写字母之前的所有内容。

我们一直在使用以下正则表达式:

"[A-Z][a-z]+|([A-Z]|[0-9])+\b|[A-Z]+(?=[A-Z])|([a-z]|[0-9])+

这个正则表达式一直效果很好,但是当遇到字符串:

"X-999"

时则不适用。

我们正在这样实现:

        StringBuilder builder = new StringBuilder();
        builder.Append("[A-Z][a-z]+|([A-Z]|[0-9])+\b|[A-Z]+(?=[A-Z])|([a-z]|[0-9])+");

        foreach (Match match in Regex.Matches(name, builder.ToString()))
        {
            //do things with each match
        }

这里的问题是它只匹配了“999”,而没有匹配“X”。有什么想法吗?我在regexr.com上测试了一下,它说这个正则表达式应该能够匹配这两个子字符串。

也许是因为正则表达式中没有 -,尝试使用 [A-Z][a-z]+|([A-Z]|[-0-9])+\b|[A-Z]+(?=[A-Z])|([a-z]|[0-9])+ - m.cekiera
1个回答

4

\b在C#字符串中被解释为转义序列(\u0008,退格)。

需要对斜杠进行转义(即\\b),或者使用带有@符号的逐字字符串:

        builder.Append(@"[A-Z][a-z]+|([A-Z]|[0-9])+\b|[A-Z]+(?=[A-Z])|([a-z]|[0-9])+");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接