正则表达式:基于模式将字符串分割成两个集合

5
使用 C# 的 Regex.Split 方法,我想要分割以 RepXYZ 开头的字符串,其中 XYZ 部分是一个始终具有 3 或 4 个字符的数字。
示例:
- "Rep1007$chkCheckBox" - "Rep127_Group_Text"
结果应该是:
- {"Rep1007","$chkCheckBox"} - {"Rep127","_Group_Text"}
到目前为止,我尝试了 (Rep)[\d]{3,4} 和 ((Rep)[\d]{3,4})+,但这两种都给出了我不想要的结果。
2个回答

3
使用Regex.Split通常会导致结果数组中出现空项或不需要的项。在Regex.Split中使用(Rep)[\d]{3,4},将把没有数字的Rep放入结果数组中。(Rep[\d]{3,4})将把Rep和数字放入结果中,但由于匹配是在开头,所以数组中会有一个空项。
我建议在这里使用Regex.Match
var match = Regex.Match(text, @"^(Rep\d+)(.*)$");
if (match.Success)
{
    Console.WriteLine(match.Groups[1].Value);
    Console.WriteLine(match.Groups[2].Value);
}

查看正则表达式演示

enter image description here

细节:
  • ^ - 字符串的开头
  • (Rep\d+) - 捕获组1: Rep 和一个或多个数字
  • (.*) - 捕获组2:任意一个或多个字符(不包括换行符),尽可能多地匹配
  • $ - 字符串的结尾。

使用基于环视的正则表达式更好地实现了分割方法:

var results = Regex.Split(text, @"(?<=^Rep\d+)(?=[$_])");

查看这个正则表达式演示(?<=^Rep\d+)(?=[$_])将字符串在紧随字符串开头的以Rep和一个或多个数字结尾,且紧随其后为$_的位置处分割。

1
尝试根据正则表达式模式在$_处进行拆分:
string input = "Rep127_Group_Text";
string[] parts = input.Split(new[] { '$', '_' }, 2);
foreach (string part in parts)
{
    Console.WriteLine(part);
}

这将打印:

Rep127
Group_Text

1
你的正则表达式与 Rep127_Group_Text 无法匹配 - Wiktor Stribiżew
@WiktorStribiżew 我已修复它,至少对于给定的示例数据而言。似乎没有任何 API 可以停止 Regex.Split 按每个出现位置拆分(不像普通的正则表达式字符串拆分)。 - Tim Biegeleisen

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