如何使用Regex在C#中获取匹配的子组?

时间:2016-03-04 09:50:20

标签: c# regex

我有一个字符串:

{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.怎么做?

2 个答案:

答案 0 :(得分:1)

第一组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"]

方括号([])根本不需要,因为这意味着“数字od数字(\d+)或点数”,而不是“数字跟随的数字”用一个点后跟一些数字“。

答案 1 :(得分:1)

你可以这样做:

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.(两个点)或{{1}}(点在结束)。