2010-02-03 50 views
3

我怎麼能在C#格式化字符串解析多個值嗎?解析值

字符串的格式如下: 「等等等等(富:這個,巴:那)」

我需要解析出foobar值。括號總是在行的末尾。

編輯:對不起......這不是很清楚。我的意思是我需要知道「富」價值和「酒吧」價值,所以我可以說,在其他地方,「富是這個」和「酒吧就是這樣」。

感謝

+0

@Ross檢查我更新的解決方案 – 2010-02-03 19:04:30

回答

1

編輯: OP澄清後更新。

這應該做:

string input = "blah blah blah (foo:this, bar:that,1:one,2:two)"; 
string pattern = @"\((?:(?<Values>.*?:[^,\s]+)[,\s]*)+\)"; 
foreach (Match m in Regex.Matches(input, pattern)) 
{ 
    foreach (Capture c in m.Groups["Values"].Captures) 
    { 
     string[] values = c.Value.Split(':'); 
     Console.WriteLine("{0} : {1}", values[0], values[1]); 
    } 
} 

此輸出:

  • FOO:此
  • 欄:即
  • 1:一個
  • 2:2

如果您需要確保只發生在比賽在字符串的結尾,而不是字符串匹配的其他地方類似的格式化的值,添加$到模式的結尾:

string pattern = @"\((?:(?<Values>.*?:[^,\s]+)[,\s]*)+\)$"; 
0

正則表達式不應該被用來解析如果可能的話,只有詞法。將lexed標記傳遞給有限狀態機以進行實際解析。

0

我做相當基於你的問題的幾個假設,在這裏,但這應該讓你在正確的方向前進。

#!/usr/bin/perl 

my $input = "blah blah blah (foo:this, bar:that, foo2:150)"; 

my @ray = ($input =~ /.*?:(\w*)/g); 
foreach $x (@ray) 
{ 
    print "Value: '$x'\n"; 
} 

輸出:

Value: 'this' 
Value: 'that' 
Value: '150' 
0

至於.NET你可以使用捕捉這樣的:

> $s = "blah blah blah (foo:this, bar:that)" 
> $result = [regex]::Match($s, '[^(]*\((?:\w+:(?<t>\w+),\s*)*\w+:(?<t>\w+)\)$') 
> $result.Groups 

Groups : {blah blah blah (foo:this, bar:that), that} 
Success : True 
Captures : {blah blah blah (foo:this, bar:that)} 
Index : 0 
Length : 35 
Value : blah blah blah (foo:this, bar:that) 

Success : True 
Captures : {this, that} 
Index : 30 
Length : 4 
Value : that 

> $result.Groups[1].captures 
Index           Length Value 
-----           ------ ----- 
20            4 this 
30            4 that 

它在PowerShell代碼。然而,PowreShell基於.NET,所以這應該在.NET中工作。

的解析表達式基於您發佈的例子,所以它跳過一切都交給(,然後開始解析值。 注意(?:..)的非捕獲組,因此不會在結果出現。