我怎麼能在C#格式化字符串解析多個值嗎?解析值
字符串的格式如下: 「等等等等(富:這個,巴:那)」
我需要解析出foo
和bar
值。括號總是在行的末尾。
編輯:對不起......這不是很清楚。我的意思是我需要知道「富」價值和「酒吧」價值,所以我可以說,在其他地方,「富是這個」和「酒吧就是這樣」。
感謝
我怎麼能在C#格式化字符串解析多個值嗎?解析值
字符串的格式如下: 「等等等等(富:這個,巴:那)」
我需要解析出foo
和bar
值。括號總是在行的末尾。
編輯:對不起......這不是很清楚。我的意思是我需要知道「富」價值和「酒吧」價值,所以我可以說,在其他地方,「富是這個」和「酒吧就是這樣」。
感謝
編輯: 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]);
}
}
此輸出:
如果您需要確保只發生在比賽在字符串的結尾,而不是字符串匹配的其他地方類似的格式化的值,添加$
到模式的結尾:
string pattern = @"\((?:(?<Values>.*?:[^,\s]+)[,\s]*)+\)$";
正則表達式不應該被用來解析如果可能的話,只有詞法。將lexed標記傳遞給有限狀態機以進行實際解析。
我做相當基於你的問題的幾個假設,在這裏,但這應該讓你在正確的方向前進。
#!/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'
至於.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中工作。
的解析表達式基於您發佈的例子,所以它跳過一切都交給(
,然後開始解析值。 注意(?:..)
的非捕獲組,因此不會在結果出現。
@Ross檢查我更新的解決方案 – 2010-02-03 19:04:30