2012-12-20 72 views
3

我試圖匹配等號周圍的字符串中的文本。
我的正則表達式是這樣的:"((?:\\S+\\s)?\\S*=)(\\S*(?:\\s\\S+)?)"\\在那裏,因爲C#不喜歡使用'\'字符串未轉義)。.NET正則表達式問題,.NET正則表達式使用不同的規則引擎?

給定字符串"the thing=12 and otherthing = 'thirty'"這會返回「the thing =」,「12 and」,「otherthing =」和「'thirty'」組。

我在正則表達式不好,我不確定下一步該怎麼做。
我需要這個返回「thing」,「12」,「otherthing」和「thirty」組(注意在「thirty」中刪除了單引號)。

任何人都可以幫助我嗎?看起來像C#的正則表達式解析器不同於gskinner.com上的解析器,因爲我認爲我有一些這樣的工作,但它不在C#中。

+1

嘗試在字符串文字前使用@符號。例如@「my \ S string」如果你這樣做,你不必逃避你的反斜槓。 –

+1

你見過http://regexhero.net/嗎?前些日子用它來玩我用.NET編寫的正則表達式。 – mletterle

+0

所以你真正需要的是用'='和空格字符拆分字符串,並刪除'''字符? –

回答

1

該圖案取=之前的第一個字(連續的非空格)和以下引用的值或第一個詞。

@"(?<name>[^ =]+?)\s*=\s*('(?<value>[^']+)'|(?<value>[^\s]+))"

(在C#中,它往往是最好使用一個字符串@"\s"爲regexs因爲你只需要逃避雙引號@"\s""" == "\\s\""

var pattern = @"(?<name>[^ =]+?)\s*=\s*('(?<value>[^']+)'|(?<value>[^\s]+))"; 
var s = "the thing=12 and otherthing = 'thirty'"; 
foreach(Match match in Regex.Matches(s, pattern)) 
    Console.WriteLine("{0} = {1}", 
     match.Groups["name"].Value, 
     match.Groups["value"].Value); 

對於the thing=12 and otherthing = 'thirty',它產生:

thing = 12 
otherthing = thirty 
+0

我可以問你做出的一些決定嗎?爲什麼'[^ =]'而不是'[^ \ s =]'?在此之後,您同時使用'+'和'?'。據我所知,「?」沒有意義?我還沒有得到它的「價值」一面,但我只是想明白你爲什麼以某種方式做到這一點。 –

+0

'?'會導致匹配最小而不是最大。否則,匹配總是最大的。因此,如果字符串中存在多個'='的實例(沒有'?'),則可以將所有內容匹配到最後一個實例,包括所有其他'='實例(您不匹配最後一個實例,因爲它仍然需要以某種方式匹配模式的其餘部分)。 –

0

這聽起來像是一個工作String.Split。如果您確定需要使用正則表達式,則可以使用Regex.Split

+0

這可能是真的,但這只是一個實踐的事情,我想學習正則表達式。 –

2

也許這樣?

string input = "bob = 20 joe=thirty"; 
var regex = new Regex(@"(?<left>[^=]+?)\s+=\s+(?<right>[^\s]+)"); 
foreach(Match match in regex.Matches(input)) 
{ 
    Console.WriteLine("{0} = {1}", 
     match.Groups["left"].Value, 
     match.Groups["right"].Value); 
}