1

私は線を一致させるために以下を使用しています。Lineは以下のようになります。たとえば、field1は存在するが、値がnullの場合、一致しません。field1などに空白や値がない場合でも一致させたい。何か案は?ありがとう

   field33
   field1 
   field2   lkjk
   field3   12.01.12

 static string partPattern = @"^(?<Key>\w+)\s+(?<Value>.*)$";

 line = line.Trim();  Match m = Regex.Match(line, partPattern);  
if(m.Groups["Key"].Length > 0) { 
 //do something heree 
}

したがって、field33を見ると、行はfield33になり、キーが存在していても正規表現の条件付きステートメントは失敗します...

4

1 に答える 1

1

正規表現パターンでは、+を示しますOne or More

代わりにこの文字列を使用してみてください

@"^(?<Key>\w+)\s+(?<Value>.*)$

は0 を含むことを*示します。Any Number

アップデート

次のコードをテストしたところ、この出力が得られました。

        string t1 = "field1   ";
        string t2 = "field2   iopoi";
        string t3 = "field3   12.12.12";
        Regex rTest = new Regex(@"^(?<Key>\w+)\s+(?<Value>.*)$");
        if (rTest.IsMatch(t1))
        {
            MessageBox.Show("T1 match");
            foreach (Match m in rTest.Matches(t1))
                textBox1.Text += String.Format("Key: {0}\tValue: {1}\r\n", m.Groups["Key"].Value, m.Groups["Value"].Value);
        }
        textBox1.Text += "\n\n";
        if (rTest.IsMatch(t2))
        {
            MessageBox.Show("T2 match");
            foreach (Match m in rTest.Matches(t2))
                textBox1.Text += String.Format("Key: {0}\tValue: {1}\r\n", m.Groups["Key"].Value, m.Groups["Value"].Value);
        }
        textBox1.Text += "\n\n";
        if (rTest.IsMatch(t3))
        {
            MessageBox.Show("T3 match");
            foreach (Match m in rTest.Matches(t3))
                textBox1.Text += String.Format("Key: {0}\tValue: {1}\r\n", m.Groups["Key"].Value, m.Groups["Value"].Value);
        }

出力:

Key: field1 Value: 
Key: field2 Value: iopoi
Key: field3 Value: 12.12.12

.Trim()また、各初期文字列でこのコード呼び出しをテストしました。

呼び出し後に t1 が一致しませんでした.Trim()

この理由は、.Trim が field1 や field33 などに続くすべての空白を削除し、正規表現にはOne or More空白文字が必要だからです。

新しい正規表現:代わりにこれを使用してみてください@"^(?<Key>\w+)\s*(?<Value>.*)$"

\s の後にも * が続くことに注意してください。これで、Trim を使用した後も一致するはずです。

于 2012-06-20T16:32:16.307 に答える