【问题标题】:Finding all substrings in a string c# (Regex, Char Array?) [duplicate]查找字符串c#(正则表达式,字符数组?)中的所有子字符串[重复]
【发布时间】:2015-07-17 15:28:25
【问题描述】:

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

“CityABCProcess 测试”或“cityABCProcess 测试”

to yield : [ "City/city", "ABC", "Process", "Test" ]

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

这可以通过正则表达式处理吗?或者我应该将我的字符串转换为字符数组并使用一些索引逻辑手动检查这些情况。 lambda 解决方案可以在这里工作吗?解决这个问题的最佳方法是什么?

【问题讨论】:

  • 这在很大程度上取决于您的意见,但 IMO 如有疑问,请不要使用正则表达式。它可能会更快(如果速度是一个非常重要的问题,那么它可能值得考虑),但维护它通常是一件令人头疼的事情。
  • "\\p{Lu}+" 将是您的正则表达式的起点......但是手动编写代码可能会更容易。 (请注意,字符串已经是可索引的字符序列)...stackoverflow.com/questions/18125738/… 可能会有所帮助。
  • 实现一个循环for-loop中的所有字符并填充StringBuilder的方法。
  • @user2366842:在大多数情况下,正则表达式是最慢的选项。

标签: c# arrays regex string parsing


【解决方案1】:

不要理会反对者!即使是这样的事情,RegEx 也没有那么复杂。我相信这种模式应该可以解决问题:

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

请参阅here 以获得工作演示。这只是一堆按顺序处理的OR。这是细分:

  • [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);
    }

【讨论】:

  • 可以确认,@StevenDoggart 是some kind of wizard :-)
  • 这太接近了!谢谢回复。我正在使用regexr.com 对其进行测试我发现它在这种情况下不起作用:“City ABC Process”它只得到“AB”而不是“ABC”也遗漏了数字“Process 1”
  • This example 显示类似的内容。
  • 好点。修复了我的答案以使用 \b 而不是 $ 来纠正这个问题。
  • 您可以将([A-Z]|[1-9]) 用于大写,([a-z]|[1-9]) 用于小写
猜你喜欢
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 2017-07-04
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多