정규식 캡처 그룹

나는 항상 정규식에서 캡처링 그룹을 사용하여 나중에 참조하기 위해 일치하는 문자열의 일부(예: 대체)를 추출했습니다.

TIL 실제 매칭 중에도 사용할 수 있습니다 😮.

그룹을 캡처하는 것이 도대체 무엇입니까?



이 메서드 호출이 포함된 코드 조각이 제공됩니다.

doSomething(firstArg, secondArg)

인수를 바꿔야 하는 다른 메서드를 사용하기 위해 대체하려면 다음과 같은 정규식을 사용하면 됩니다.

doSomething\((.+),\s(.+)\)

둥근 괄호 안의 식 부분(이스케이프된 부분 제외)은 캡처 그룹입니다. 예를 들어 한정 기호를 적용하는 것과 같이 래핑된 식을 전체적으로 처리하는 데 사용할 수 있습니다.
또한 캡처 그룹을 사용하면 정규식 일치 부분을 쉽게 추출할 수 있습니다.

이전 예에서 경기 후 위치별로 추출된 그룹을 참조할 수 있습니다.
따라서 그룹 1은 firstArg이고 그룹 2는 secondArg입니다.

내 편집기가 정규식 대체를 지원하거나 작업을 자동화하기 위해 일부 스크립트를 작성하는 경우 다음과 같이 메서드를 대체할 수 있습니다.

doSomethingElse($2, $1)

결과적으로

doSomethingElse(secondArg, firstArg)

(올바른 구문은 실제로 사용 중인 도구에 따라 다릅니다.)



분명히 그것에 더 많은 것이 있습니다!



이런 종류의 대체는 정말 멋지지만 캡처 그룹은 그보다 더 강력할 수 있습니다! 🚀

문자열의 일부가 이미 일치된 다른 부분과 일치하는지 확인하기 위해 일치 자체 중에 사용할 수도 있습니다.
예를 들어 문자열이 중간에 문자열을 허용하는 동일한 숫자 시퀀스로 시작하고 끝나는지 확인하려면 다음과 같이 할 수 있습니다.

(\d+)[A-Za-z]+\1

첫 번째이자 유일한 캡처링 그룹(\d+)은 모든 숫자 시퀀스와 일치하고 [A-Za-z]+ 표현식은 문자 시퀀스와 일치합니다.
마법은 \1 식에서 발생합니다. 식의 첫 번째 캡처링 그룹을 참조하여 문자열의 이 마지막 부분이 해당 그룹과 일치하는지 확인하는 방법입니다. 숫자는 캡처 그룹의 번호에 해당합니다.

이 정규식을 사용하여 다음과 같은 문자열을 확인할 수 있습니다.

123HelloWorld123

보다 현실적인 시나리오는 생성 및 업데이트 날짜를 보유한 레코드가 있는 csv 파일일 수 있습니다.

name,       created,    updated
record_1,   2020-04-10, 2020-04-21
record_2,   2020-04-11, 2020-04-11
record_3,   2020-04-12, 2020-04-22
record_4,   2020-04-13, 2020-04-13
record_5,   2020-04-14, 2020-04-20
record_6,   2020-04-15, 2020-04-16
record_7,   2020-04-16, 2020-04-16

생성 날짜와 업데이트 날짜가 동일한 레코드를 찾으려는 경우 캡처 그룹을 사용할 수 있습니다.
정규식은 다음과 같습니다.

.+?,\t(\d{4}-\d{2}-\d{2}),\t\1

읽기 쉽지는 않지만 아주 간단합니다. 중요한 비트는 날짜와 일치하는 둥근 괄호 안의 캡처 그룹과 이를 호출하는 \1입니다. 정규식은 이 두 요소가 실제로 동일한 경우에만 일치합니다.

텍스트 편집기에서 검색을 실행하면 날짜가 일치하는 모든 줄이 강조 표시됩니다.


이것들은 간단한 예이고 더 복잡한 일치가 가능하지만 내가 이미 정말 유용하다고 생각했던 정규 표현식의 기능이 실제로 훨씬 더 강력하다는 사실에 정말 놀랐습니다!

좋은 웹페이지 즐겨찾기