3

等号の周りの文字列内のテキストを一致させようとしています。
私の正規表現は次 "((?:\\S+\\s)?\\S*=)(\\S*(?:\\s\\S+)?)"のとおりです(\\C#はエスケープされていない「\」文字列を使用したくないため、そこにあります)。

文字列を指定すると"the thing=12 and otherthing = 'thirty'"、「the thing="、"12 and"、"otherthing="、および "'thirty'"」のグループが返されます。

私は正規表現が苦手で、次に何をすればよいかわかりません。
「thing」、「12」、「otherthing」、「thirty」のグループを返すには、これが必要です (「thirty」で一重引用符が取り除かれていることに注意してください)。

誰でもこれで私を助けることができますか?C# Regex パーサーは gskinner.com のパーサーとは異なるようです。これは一部機能していると思っていましたが、C# では機能していません。

4

3 に答える 3

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);
}
于 2012-12-20T23:11:57.300 に答える
1

=このパターンは、引用符で囲まれた値または最初の単語の前に最初の単語 (連続する非スペース) を取ります。

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

(C# では、@"\s"二重引用符のみをエスケープする必要があるため、正規表現にリテラル文字列を使用するのが最善の場合がよくあります。 @"\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
于 2012-12-21T02:58:39.587 に答える
0

これはString.Splitの仕事のように聞こえます。正規表現が必要であることが確実な場合は、Regex.Splitを使用できます。

于 2012-12-20T23:08:22.773 に答える