如何使用正则表达式在 C# 中获取匹配的子组

本文关键字:获取 何使用 正则表达式 | 更新日期: 2023-09-27 18:37:16

我有一个字符串:

{Lower Left  (  460700.000, 2121200.000)}

这是我的代码:

    var pat = @"Lower Left's*'('s*['d'.]+',('s)*['d'.]+')";
    var r = new Regex(pat, RegexOptions.IgnoreCase);
    var m = r.Match(s);

m.Groups[0] 现在等于:

{Lower Left  (  460700.000, 2121200.000)}

但是我想在两个变量中获取坐标字符串,例如 X 和 Y。 怎么办?

如何使用正则表达式在 C# 中获取匹配的子组

你可以

这样做:

string s = "{Lower Left  (  460700.000, 2121200.000)}";
var pat = @"Lower Left's*'('s*('d+'.'d+)','s*('d+'.'d+)')";
var r = new Regex(pat, RegexOptions.IgnoreCase);
var m = r.Match(s);
Console.WriteLine(m.Groups[1]); // first number
Console.WriteLine(m.Groups[2]); // second number

如果您的号码可能包含也可能不包含.,您可以使用:

string s = "{Lower Left  (  460700.000, 2121200.000)}";
var pat = @"Lower Left's*'('s*('d+(?:'.'d+)?)','s*('d+(?:'.'d+)?)')";
var r = new Regex(pat, RegexOptions.IgnoreCase);
var m = r.Match(s);
Console.WriteLine(m.Groups[1]);
Console.WriteLine(m.Groups[2]);

这将接受这个数字:123456(无点)、123.456(里面有一个点),但不接受123.456.7(两个点)或1234.(最后的点)。

第一组 allways 返回整个匹配项,而索引组包含匹配组的实际值。因此,您需要相应地m.Groups[1]m.Groups[1]

您还可以为组命名:

@"Lower Left's*'('s*(?<X>'d+'.'d+),('s)*(?<Y>'d+'.'d+)')";

其中(?<identifier>anyPattern)表示构建一个名为 identifier 的匹配组,并具有 anyPattern 给出的模式。允许您像这样访问它们:

m.Groups["X"]
m.Groups["Y"]

方括号([])也根本不需要,因为这意味着"一个数字('d+)或一个点",而不是"一个数字后跟一个点,然后是一个数字"。