2012-12-20 38 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); 
}