2016-03-04 60 views
0

我有一個字符串:如何使用正則表達式在C#中獲得匹配的子組?

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

+0

Like ['Lower Left \ s * \(\ s *(? [\ d \。] +),\ s *(? [\ d \。] +)\)'](http:/ /regexstorm.net/tester?p=Lower+Left%5cs*%5c(%5cs*(%3f%3cX%3e%5b%5cd%5c.%5d%2b)%2c%5cs*(%3f%3cY %3E%5B%5CD%5c所示。%5D%2b)的%5C)與I =%7bLower +左++(++ 460700.000%2C + 2121200.000)%7D)?請參閱[**本演示**](http://ideone.com/vPWxwF)。 –

+0

你知道你沒有*在捕獲組中包裹你的'[\ d \。] +'匹配嗎? – Rawling

回答

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

第一組allways allways返回整個匹配,而索引的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+),或點」,而不是「一些數字後跟一個點,後面跟着一些數字「。

+0

m.Groups [n] for n> = 1是「」(Success = False) –

相關問題