C# 如何通过编号分隔字符串 (1. 2. ...)

C# how to separate a string by numbering (1. 2. ...)

我有这个字符串“1: This 2: Is 3: A 4: Test”,想根据编号拆分它,如下所示:

“1:这个”
“2:是”
“3:A”
“4:测试”

我认为这应该可以通过正则表达式实现,但不幸的是我对此了解不多。

这:string[] result = Regex.Split(input, @"\D+");只是拆分没有冒号的数字及其后面的内容。

如果您像这样使用捕获组 ()

string[] result = Regex.Split(str, @"(\d+:)");

捕获的值也将添加到数组中。然后剩下要做的就是将每个第一个值与每个第二个值合并(我们跳过索引 0,因为它是空的):

List<string> values = new();
for (int i = 1; i < result.Length; i += 2)
{
    values.Add(result[i] + result[i + 1]); 
}

可能有更简洁的方法来执行此操作,但这行得通。

您可以使用

string[] result = Regex.Split(text, @"(?!^)(?=(?<!\d)\d+:)")

参见this regex demo。请注意,当您的项目符号点包含两位或更多位数字时,(?<!\d) 否定回顾是必要的。 详情:

  • (?!^) - 不在字符串的开头
  • (?=(?<!\d)\d+:) - 紧跟一个或多个数字(前面没有任何数字)和一个 : 字符的位置。

使用 \D+ 匹配 1 个或多个非数字,因此将匹配 : This 以拆分。

除了使用拆分,您还可以匹配部分:

\b[0-9]+:.*?(?=\b[0-9]+:|$)

模式匹配:

  • \b 防止部分单词匹配的单词边界
  • [0-9]+:匹配1+个数字和:
  • .*? 匹配尽可能少的字符
  • (?=\b[0-9]+:|$) 正面前瞻,断言 1+ 位数字和 : 或字符串末尾向右

.NET regex demo

C# 示例:

string str = "1: This 2: Is 3: A 4: Test";
string pattern = @"\b[0-9]+:.*?(?=\b[0-9]+:|$)";

MatchCollection matchList = Regex.Matches(str, pattern);
string[] result = matchList.Cast<Match>().Select(match => match.Value).ToArray();

Array.ForEach(result, Console.WriteLine);

输出

1: This 
2: Is 
3: A 
4: Test