查找字符串c#(正则表达式,字符数组?)中的所有子字符串

查找字符串c#(正则表达式,字符数组?)中的所有子字符串,c#,arrays,regex,string,parsing,C#,Arrays,Regex,String,Parsing,我需要识别字符串中的子字符串,例如: “CityABC过程测试”或“CityABC过程测试” 产生:[“城市/城市”、“ABC”、“过程”、“测试”] 子字符串中的第一个字符串可以是小写或大写 任何重复出现大写字母的子字符串都将成为子字符串,直到找到小写字母或空格“ABCProcess->ABC,ABCProcess->ABC” 如果有一个大写字母后跟一个小写字母,则在下一个大写字母之前,子字符串将是所有内容 这可以由正则表达式处理吗?或者我应该将字符串转换为字符数组,并使用一些索引逻辑手动检查

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

“CityABC过程测试”或“CityABC过程测试”

产生:[“城市/城市”、“ABC”、“过程”、“测试”]

  • 子字符串中的第一个字符串可以是小写或大写
  • 任何重复出现大写字母的子字符串都将成为子字符串,直到找到小写字母或空格“ABCProcess->ABC,ABCProcess->ABC”
  • 如果有一个大写字母后跟一个小写字母,则在下一个大写字母之前,子字符串将是所有内容

  • 这可以由正则表达式处理吗?或者我应该将字符串转换为字符数组,并使用一些索引逻辑手动检查这些大小写。lambda解决方案在这里有效吗?最好的办法是什么?

    不要理会那些反对者!即使是这样的东西,在正则表达式中也没有那么复杂。我认为这种模式应该起到作用:

    [A-Z][A-Z]+|[A-Z]+\b|[A-Z]+(?=[A-Z])|[A-Z]+

    请参阅以获取有效的演示。它只是一堆按顺序处理的
    。以下是分类:

    • [A-Z][A-Z]+
      任何以大写字母开头,然后后跟所有小写字母的单词
    • [A-Z]+\b
      -所有大写字母的任何单词(以便包括在以下选项中排除的最后一个大写字母)
    • [A-Z]+(?=[A-Z])
      所有大写字母,但不包括下一个单词的第一个大写字母的任何单词
    • [a-z]+
      -所有小写的单词
    例如:

    string input = "CityABCProcess TEST";
    StringBuilder builder = new StringBuilder();
    builder.Append("[A-Z][a-z]+");
    builder.Append("|");
    builder.Append("[A-Z]+$");
    builder.Append("|");
    builder.Append("[A-Z]+(?=[A-Z])");
    builder.Append("|");
    builder.Append("[a-z]+");
    foreach (Match m in Regex.Matches(input, builder.ToString()))
        {
        Console.WriteLine(m.Value);
        }
    

    这在很大程度上取决于您的意见,但IMO在有疑问时,不要使用正则表达式。它可能更快(如果速度是一个巨大的问题,那么它可能值得考虑),但保持它通常是一件令人头痛的事。“\\p{Lu}+”将是您正则表达式的起点。。。但手工编写代码可能会更容易。(请注意,字符串已经是可索引的字符序列)。。。可能会有帮助。实现一个方法,在
    for循环中循环所有字符
    ,并填充
    StringBuilder
    @user2366842:在大多数情况下,regex是最慢的选项。可以确认,@Stevendogart是:-)这太接近了!谢谢你的回复。我正在使用测试它,我发现它在这种情况下不起作用:“城市ABC过程”它只得到“AB”而不是“ABC”还漏掉了数字“过程1”显示了类似的东西。很好。修正了我用
    \b
    而不是
    $
    来纠正这个问题的答案。你可以用
    ([A-Z]|[1-9])
    来表示大写,用
    ([A-Z]|[1-9])
    来表示小写