2017-03-02 1 views
0

기본적으로, 내가하고 싶은 것은 통합 된 diff의 범위 정보를보고주의해야 할 코드 행을 정확히 알아야한다는 것입니다. 예컨대통합 diff에서 범위 정보를 올바르게 구문 분석하려면 어떻게해야합니까?

이 :

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

이 총 단지 1 라인은 DIFF 3 개 라인 위 변화 아래 보여주기 때문에, 변경되었음을 알려줍니다 -을 (따라서 6 7 = 1) 또한 라인 1830 (즉, 1827 + 3) 나를 가리 킵니다.

이 더 구체적인 정보는 실제로 1830 번 줄에서 줄이 제거되고 (-) 1830 줄에 줄이 추가 (+)되었음을 나타냅니다. -

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

이것이 나에게 말하고하는 라인 (881)에서 (878 + 3) (9) 라인 (6 ~ 15) 삭제 된 것입니다 :

또는

은 더 분명 다른 사랑하는이 범위 정보를 고려하는 것이 만들려면 그러나 라인 881에서 단지 7 라인이 추가되었다 (13-6).

그래서 정규식이나 다른 루비 문자열 방법을 사용하면 위의 정보를 쉽게 풀 수 있습니까? 내가 쉽게 정보를 당겨 어떻게

예 :

  • 라인 번호 (즉, 단지 1827 또는 878) 그때 난 상관 실제 인라인 수를 결정 + 3을 추가 할 수 있습니다, 약. 두 줄이 항상 동일하지 않을 수도 있기 때문에 둘 다 있어야합니다.
  • 영향을 줄 수 (일명 7, 15 또는 13 직후 위의 예에서 ,)
  • 나는 각각의 작업 (추가 또는 삭제)을 추적해야합니다 어떻게, 그렇게하는 동안 작업의

문자열을 자르고 문자를 직접 시도했습니다. myString[3]은 나를 -으로 알려주지 만 라인 번호가 1, 10, 100, 1000, 10000 등일 수 있기 때문에 안정적으로 작동하는 유일한 문자입니다. 따라서 유일한 방법은 문자열을 스캔 한 다음 구문 분석하는 것입니다.

편집 한

내가 시도 것을 보여주기 위해 몇 가지 코드를 추가합니다.

내가 @diff_lines라는 변수에 DIFF의 내용을 가지고 가정 :

@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

정규 표현식을 사용하면 'split'해머를 반복해서 사용하는 것보다 구성 요소를 분리하는 것이 더 나을 것입니다. – 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과 같은 도구를 사용해보십시오.

관련 문제