1

後処理した差分があり、等しい行を平らにしたい。以下に一例を示します。

Foo
-Bar
+Bar
Baz

等しい行を押しつぶして、差分に表示されないようにしたい。これは非常に簡単です

-(.*)\n\+\1\n

次のような複数行の一致があると、問題が発生します。

-Foo
-Bar
+Foo
+Bar

何か案は?それとも、RegEx を実行して単純なパーサーを作成するべきではありませんか? それともすでに存在しますか?

より良い解決策があれば、いくつかの裏話。2 つのファイルを比較して、それらが同じかどうかを確認しています。悲しいことに、出力はほぼ同じですが、後処理が必要です。たとえば、

-on line %d
+on line 8

そのため、既知の文字列を他の既知の文字列に変換してから、差分が空であるか、まだ異なるかを確認しようとしています。

4

3 に答える 3

0

s 修飾子正の先読みを使用できます。

  • s修飾子を使用すると、改行をドットに一致させることもできます
  • 肯定的な先読みを使用すると、一致の一部にせずに一致の発生を見つけることができます (その間のすべてをスキップします...)。

regexpalでのマッチングの例を次に示します。

必要なものに近い C# 正規表現のサンプルを次に示します。

var sourceString = @"-Foo
    +Foo
    la
    -Bar
    +Foo
    la
    -Ko
    +Bar
    la
    +Ko
    -Ena
    asdsda
    -Dva
    +Ena
    +Dva
    ";
Regex ItemRegex = new Regex(@"(?s)\-(.*?)\n(?=(.*?)(\+\1))", RegexOptions.Compiled);
foreach (Match ItemMatch in ItemRegex.Matches(sourceString))
{
    Console.WriteLine(ItemMatch);
}
于 2013-03-31T13:08:22.100 に答える
0

これはうまくいくと思います(ペアを繰り返していない限り):

   sed 's/^[-+]//' filename | perl -ne 'print unless $seen{$_}++'

先頭の +/- をヌル文字列に置き換えます。次に、一意の行のみを選択します。

于 2013-03-31T04:35:29.927 に答える