>  기사  >  웹 프론트엔드  >  자바스크립트 정규 표현식의 그룹화에 대한 자세한 설명

자바스크립트 정규 표현식의 그룹화에 대한 자세한 설명

高洛峰
高洛峰원래의
2017-01-20 13:47:051518검색

이전에 정규식 시작에 대한 기사를 쓴 적이 있습니다. 정규식에 대해 비교적 잘 이해하고 있다고 생각했는데, 오늘은 제가 충분히 주의하지 않았기 때문일 수도 있습니다. 정규 표현식으로 그룹화합니다. JS 정규식을 충분히 이해하지 못한다면 여기를 클릭하여 자세히 알아볼 수 있습니다.

그룹화는 정규식에서 널리 사용됩니다. 제가 이해하는 그룹화는 한 쌍의 괄호()입니다. 각 괄호 쌍은

그룹화를 나타냅니다. >

Capturing grouping

Non-capturing grouping

Capturing grouping


Capturing grouping은 match exec와 같은 용도로 사용됩니다. 함수에서는 해당 grouped가 결과는 두 번째 항목과 세 번째 항목의 형태로 얻어집니다. 먼저 예제를 살펴보겠습니다.

var reg = /test(\d+)/;
 var str = 'new test001 test002';
 console.log(str.match(reg));
//["test001", "001", index: 4, input: "new test001 test002"]

(d+) 코드에서 그룹(어떤 사람들은 하위 패턴이라고도 함)이지만 모두 같은 의미입니다. 위의 예 test001은 완전 일치 결과

입니다. 그러나 그룹 일치는 전체 일치 결과(즉, test001)에서 하위 패턴 d+와 일치하는 문자를 찾는 것이므로 당연히 001입니다.

그런데 오늘 제가 접한 상황은 이렇습니다

var reg = /test(\d)+/;
 var str = 'new test001 test002';
 console.log(str.match(reg));
//["test001", "1", index: 4, input: "new test001 test002"]

차이점은 (d+)가 (d)+로 바뀌고, 전체 매칭 결과는 여전히 test001인데, 첫 번째 그룹 매칭 ​​결과가 다릅니다.
두 번째 예를 살펴보겠습니다(d)+ in 역시 탐욕스러운 패턴입니다. 먼저 0과 일치한 다음 마지막에 1과 일치합니다.

도 첫 번째 패턴과 같습니다. 이 예에서는 일치에 차이가 없지만 여기서 그룹화(d)는 단일 숫자 일치를 의미합니다.


제가 이전에 이해한 바에 따르면 첫 번째 일치 결과인 0과 일치합니다. .그러나 이러한 이해는 잘못된 것입니다. 전체 매칭은 그리디 모드이므로


그룹에서 최대한 많은 (d)를 매칭하면 마지막 매칭 결과인 1


을 캡쳐하게 됩니다. 모드를 사용하면 가능한 한 적은

var reg = /test(\d)+?/;
 var str = 'new test001 test002';
 console.log(str.match(reg));
 
//["test001", "0", index: 4, input: "new test001 test002"]


와 일치합니다. 이런 식으로 (d)의 일치 결과는 0입니다. 나중에 여전히 일치하는 결과가 있지만 여기서는 다음과 같이 일치합니다. 가능한 한 적게

비캡처 그룹화

var reg = /test(?:\d)+/;
 var str = 'new test001 test002';
 console.log(str.match(reg));
//["test001", index: 4, input: "new test001 test002"]

비캡처 그룹화는 어떤 곳에서는 괄호 쌍을 사용해야 하지만 원하지 않는다는 의미입니다. macth exec

대개 괄호 앞에 ?:를 추가합니다. 즉, (?:pattern)은 비캡처 그룹이 됩니다. ,

이렇게 하면 그룹화된 일치 내용이 일치 결과에 나타나지 않습니다. 즉, 두 번째 항목 1이 누락됩니다.

이 기사에서는 (d+)와 (d+)의 차이점에 중점을 둡니다. (d)+. 이것도 제가 오늘 밟은 함정입니다. 혹시 틀린 부분이 있으면 바로잡아주세요.

자바스크립트 정규식 그룹핑에 대한 자세한 설명과 관련 글은 PHP 중국어 홈페이지를 참고해주세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.