Wil*_*sem 4 c# regex recursion capturing-group
我必须读入包含许多坐标的文件.该文件的结构如下:
X1/Y1,X2/Y2,X3/Y3,X4/Y4
Run Code Online (Sandbox Code Playgroud)
其中X和Y是正整数.为了解决这个问题,我想使用正则表达式(我认为这通常是一个好主意,因为模式更改时的重构最少).
因此我开发了以下正则表达式:
Regex r = new Regex(@^(?<Coor>(?<X>[0-9]+)/(?<Y>[0-9]+))(,(?<Coor>(?<X>[0-9]+)/(?<Y>[0-9]+)))*$");
Run Code Online (Sandbox Code Playgroud)
但是当我在数据上测试这个正则表达式时,例如:
1302/1425,1917/2010
Run Code Online (Sandbox Code Playgroud)
正则表达式似乎只记得最后一个X,Y和Coor组.在这种情况下,Coor是"12/17",X是"1917",Y是"2010".有没有办法生成某种树.所以我找到了一个给我所有Coor表达式的对象,每个Coor下有一个X和Y组件?
如果可能的话,我只想使用一个正则表达式,这是因为格式可能会改为另一个.
你可以很容易地解决这个问题,而不使用任何正则表达式string.Split和int.Parse:
var coords = s.Split(',')
.Select(x => x.Split('/'))
.Select(a => new {
X = int.Parse(a[0]),
Y = int.Parse(a[1])
});
Run Code Online (Sandbox Code Playgroud)
如果你想使用正则表达式来验证字符串,你可以这样做:
"^(?!,)(?:(?:^|,)[0-9]+/[0-9]+)*$"
Run Code Online (Sandbox Code Playgroud)
如果您还想使用基于正则表达式的方法来提取数据,您可以首先使用上面的正则表达式验证字符串,然后按如下方式添加数据:
var coords = Regex.Matches(s, "([0-9]+)/([0-9]+)")
.Cast<Match>()
.Select(match => new
{
X = int.Parse(match.Groups[1].Value),
Y = int.Parse(match.Groups[2].Value)
});
Run Code Online (Sandbox Code Playgroud)
如果您确实希望使用单个正则表达式同时执行验证和数据提取,则可以使用两个捕获组并在Captures每个组的属性中查找结果.这是使用单个正则表达式执行验证和数据提取的一种方法:
List<Group> groups =
Regex.Matches(s, "^(?!,)(?:(?:^|,)([0-9]+)/([0-9]+))*$")
.Cast<Match>().First()
.Groups.Cast<Group>().Skip(1)
.ToList();
var coords = Enumerable.Range(0, groups[0].Captures.Count)
.Select(i => new
{
X = int.Parse(groups[0].Captures[i]),
Y = int.Parse(groups[1].Captures[i])
});
Run Code Online (Sandbox Code Playgroud)
但是,您可能需要考虑与string.Split基于解决方案相比,此解决方案的复杂性是否值得.
| 归档时间: |
|
| 查看次数: |
1869 次 |
| 最近记录: |