정규 표현식: 별개의 하위 문자열이 있는 문자열 찾기

정규 표현식: 별개의 하위 문자열이 있는 문자열 찾기

내 코드에서 잘못된 매개변수가 있는 모든 문자열을 찾고 싶습니다. 이것이 내가 하고 싶은 일이다:

다음 항목을 모두 찾습니다.

CreateNewPoint(CorrectPoint.X, IncorrectPoint.Y, other_parameters)
CreateNewPoint(IncorrectPoint.X, CorrectPoint.Y, other_parameters)

다음 항목을 모두 무시합니다.

CreateNewPoint(CorrectPoint.X, CorrectPoint.Y, other_parameters)

내 예에서는 변수 이름을 사용하고 있지만 CorrectPoint이는 IncorrectPoint무엇이든 될 수 있습니다.

나는 다음과 같은 것을 생각하고 있습니다 :

CreateNewPoint(\(.*\)\.X, \1\.Y, .*)

그러나 나는 동일한 변수 이름을 사용하지만 다른 변수 이름을 사용하는 라인에는 관심이 없습니다.

답변1

grep플래그 와 함께 및 사용 -P(" PATTERNPerl 정규식으로 해석됨"), 당신은 그것을 사용할 수 있습니다부정적인 예측.

grep -P 'CreateNewPoint\((.*)\.X, ((?!\b\1\b).)*\.Y, .*\)' /tmp/codefile
  • (?!\b\1\b)다음 항목은 단어 경계로 둘러싸인 이전에 일치한 단어일 수 없음을 의미합니다( 를 사용하면 \b해당 문자열이 누락될 수 있음).포함하다첫 번째 게임은 아니지만정확히 똑같다그것에.
  • ((?!\b\1\b).)*- 뒤에 오는 내용도 일치시키길 원하기 때문에 모든 문자를 확인하고(단어와 일치하지 않는지 확인하고) 일치시키도록 \.Y, .*\)지시해야 합니다 .grep\.Y

vim를 사용하여 유사한 일치를 수행할 수 있습니다 /CreateNewPoint(\(.*\)\.X, \(\(\<\1\.\)\@!.\)*\.Y, .*). grep몇 가지 예외를 제외하면 정규식과 유사 합니다 .

  • \@!부정적인 예측 식별자입니다.
  • \<단어의 시작입니다( \b단어 경계가 아님).
  • 끝 부분에 단어 경계가 아니라 점으로 끝날 수 없다는 뜻입니다 \..

관련 정보