3

「test2」要素が欠落しているときに「test1」値を正しく解析する次の C# RegEx 式で「test2」をオプションの要素にする方法は?

 StringBuilder sb = new StringBuilder();
 sb.AppendLine("    test1=123 any text in between  ");
 sb.AppendLine(" some ");
 sb.AppendLine(" more ");
 sb.AppendLine(" text in between ");
 sb.AppendLine("    test2=456   ");
 sb.AppendLine("    test1=789  some text .. test2=012   ");

 Regex regex = new Regex(@"test1=(?<test1>(\d+))((.|\s)+?)(test2=(?<test2>(\d+)))");

 MatchCollection matches = regex.Matches(sb.ToString());
 foreach (Match match in matches)
 {
     Group test1 = match.Groups["test1"];
     Group test2 = match.Groups["test2"];                
     System.Console.WriteLine("Test1 = {0}, Test2 = {1}", test1.Value, test2.Value);
 }

ありがとうございました。


@Oded - コメントを適切にフォーマットできず、返信が StackOverflow コメント テキストの長さで許可されているよりも長いため、ここに返信します。


ありがとうございました。2 番目の返信で提案された RegEx 式は、次の出力になります。

 Test1 = 123, Test2 = 
 Test1 = 789, Test2 =

それは完全に正しくありません。そして、最初の返信の正規表現式は次のようになります

 Test1 = 123, Test2 = 456
 Test1 = 789, Test2 = 012

テスト出力。それは正しいです。

でも私が変われば

sb.AppendLine("    test1=789  some text .. test2=012   ");

sb.AppendLine("    test1=789  some text .. test52=012   ");

テスト結果の出力には1行しかありません

Test1 = 123, Test2 = 456

そして、私はそれが欲しかった

 Test1 = 123, Test2 = 456
 Test1 = 789, Test2 =

その場合。

4

2 に答える 2

7

test2グループ全体がオプションであることを修飾します。

@"test1=(?<test1>(\d+))((.|\s)+?)(test2=(?<test2>(\d+)))?"

MSDN から -正規表現言語 - クイック リファレンス:

? - 前の要素と 0 回または 1 回一致します。

于 2012-04-27T14:00:48.330 に答える
1

? を追加 オプションにしたい要素の後

.|\s空白にも一致する.ため、次のように置き換えることができます.

改行も一致させるには、Singleline オプションを渡す必要がありますRegex regex = new Regex(@"test1=(?<test1>(\d+))((.)+?)(test2=(?<test2>(\d+)))?",RegexOptions.Singleline);

(Odedによる解決策はこれをすべて行います)

于 2012-04-27T13:59:41.940 に答える