2017-03-02 6 views
0

基本的には、統合された差分の範囲情報を見て、どのコード行に注意を払うべきかを正確に知ることだけです。例えば統合diffで範囲情報を正しく解析するにはどうすればよいですか?

、これ:

@@ -1827,7 +1827,7 @@ 

これは合計で1つだけの行はdiffが3つのラインの上方及び変化の下示すために、変更されたことを私に告げる - それを(SO 7 6 = 1)、及びまた、私は1830行目(つまり1827 + 3)を指しています。

このような特定の範囲情報は、実際に、行1830で行が削除され( - )、行1830で行が追加(+)されたことを伝えます。

以上明らかに別の差分のため、この範囲の情報を検討することにする:

@@ -878,15 +878,13 @@ 

これは私に言っている何がライン881(+ 3 878)で9行が(15から6)を削除されたということです、行881では7行しか追加されなかった(13-6)。

質問は、正規表現やその他のRuby文字列メソッドを使用して、上記の情報を簡単に引き出すことができますか?

すなわちどのように私は簡単にこの情報を引き出します:

  • 私はその後、私は気にし、実際のインライン数を決定するために+ 3を追加することができます両方行番号(つまり、ちょうど1827または878)、約。 両方の行が常に同じであるとは限らないため、両方とも一致する必要があります。
  • 影響を受けた行数(別名715または13直後に上記の例では,
  • 私はそれぞれの操作(追加または削除)を追跡することを確認しないか、それを行う一方で操作の

文字列をスライスして文字に直接移動しようとしました。 myString[3]これは私に-を与えますが、行番号が1,10,100,1000,10000などになる可能性があるので、それは確実に機能する唯一の文字です。したがって、唯一の方法は文字列をスキャンして解析することです。

編集1

は、私が試みているかを示すためにいくつかのコードを追加します。

は私が @diff_linesという変数に差分の内容を持っていると仮定します

@diff_lines.each do |diff_line| 
    if diff_line.start_with?("@@") 
    del_line_num_start = diff_line.split(/@@ /).second.split.first.split(/-/).second.split(/,/).first.to_i + 3 
    num_deleted_lines = diff_line.split(/@@ /).second.split.first.split(/-/).second.split(/,/).second.to_i - 6 
    add_line_num_start = diff_line.split(/@@ /).second.split.second.split(/\+/).second.split(/,/).first.to_i + 3 
    num_added_lines = diff_line.split(/@@ /).second.split.second.split(/\+/).second.split(/,/).second.to_i - 6 

あなたは、上記の作品を見ることができるように....見て非常に恐ろしいですと明らかに非常にではありませんドライ。

理想的には私は同じことを達成したいと思っていますが、よりきれいです。

+0

ここでの解析の目標は明確ではありませんが、入力と期待される出力の点で構造化した方が良いでしょう。また、試したことを示すコードはありません。ここでの質問。 – tadman

+0

@tadmanコードで更新された質問を参照してください。 – marcamillion

+1

正規表現では、そのことをコンポーネントに分割して繰り返し、分割したハンマーで繰り返し打ち込む方がよいでしょう。 – tadman

答えて

2

一般的な考え方は、キャプチャグループがある正規表現((...))を作成して、その文字列を便利なものに分けることです。たとえば:

diff_line.match(/\[email protected]@\s+\-(\d+),(\d+)\s+\+(\d+),(\d+)\[email protected]@/) 

これが成功した試合にMatchDataオブジェクトを生成します。

if (m = diff_line.match(...)) 
    a_start, a_len, b_start, b_len = m[1..4].map(&:to_i) 
end 

これらの数値を使用して計算を行うことができます。

正規表現の視覚化に問題がある場合は、Rubularのようなツールを使って内部構造をより詳しく説明してください。

関連する問題