使用RegEx进行多模式匹配
本文关键字:模式匹配 RegEx 使用 | 更新日期: 2023-09-27 18:22:02
我正在尝试使用RegEx将字符串拆分为多个对象。每条记录用一个:分隔,每个字段用一个~分隔。
所以样本数据看起来像:
:1~Name1:2~Name2:3~Name3
到目前为止,我拥有的RegEx是
:(?<id>'d+)~(?<name>.+)
然而,这只会匹配第一个记录,而我真的期望3。我如何让RegEx返回所有比赛而不仅仅是第一场比赛?
您的最后一个.+
是贪婪的,因此它吞噬了Name1
以及字符串的其余部分。
尝试
:(?<id>'d+)~(?<name>[^:]+)
这意味着Name中不能有:
(这可能对您的数据来说是可以的),并确保该名称不会进入下一个字段。
(还可以使用Regex.Matches方法,它可以获取所有匹配项,而不仅仅是第一个)。
使用:
var result = Regex.Matches(input, @":(?<id>'d+)~(?<name>[^:]+)").Cast<Match>()
.Select(m => new
{
Id = m.Groups["id"].Value,
Name = m.Groups["name"].Value
});
您最好对字符串使用.split()
方法。
String[] records = myString.split(':');
for(String rec : records)
{
String[] fields = rec.split('~');
//use fields
}