결과나 대체 문자열에서뿐만 아니라 패턴 자체에서도 콘텐츠의 그룹 캡처링 pattern:(...)
을 사용할 수 있습니다.
pattern:\N
을 사용하여 그룹을 패턴에서 참조할 수 있습니다, 여기서 N
은 그룹 넘버입니다.
이것이 왜 도움이 되는지 명확히 하기 위해 과제를 고려해보죠.
따옴표로 묶인 문자열을 찾아야 합니다: 작은따옴표 subject:'...'
또는 큰따옴표 subject:"..."
둘 중 하나 -- 두 변형이 일치해야 합니다.
어떻게 그것들을 찾을까요?
두 종류의 따옴표 모두 대괄호 안에 넣을 수 있습니다: pattern:['"](.*?)['"]
, 그러나 이것은 match:"...'
와 match:'..."
같은 혼용된 따옴표가 있는 문자열을 찾을 수도 있습니다. 이것은 subject:"She's the one!"
처럼 하나의 따옴표가 다른 인용문 안에 나타날 경우 불일치 항목이 발생시킬 수 있습니다. :
let str = `He said: "She's the one!".`;
let regexp = /['"](.*?)['"]/g;
// 원하는 결과가 아닙니다
alert( str.match(regexp) ); // "She'
보시다시피 패턴은 여는 따옴표 match:"
를 발견하고 나서 그 텍스트는 다른 따옴표 match:'
까지 소비됩니다, 그것은 일치 항목을 끝냅니다.
패턴이 여는 따옴표와 정확히 같은 닫는 따옴표를 찾는지 확인하세요, 그것을 그룹 캡처링과 역참조를 통해 마무리할 수 있습니다: pattern:(['"])(.*?)\1
.
올바른 코드는 다음과 같습니다:
let str = `He said: "She's the one!".`;
*!*
let regexp = /(['"])(.*?)\1/g;
*/!*
alert( str.match(regexp) ); // "She's the one!"
이제 잘 됩니다! 정규 표현식 엔진은 첫 번째 따옴표 pattern:(['"])
을 찾고 그것의 콘텐츠를 기억합니다. 그것은 첫 번째 캡처링 그룹입니다.
더 나아가 패턴에서 pattern:\1
"첫 번째 그룹에서와 같은 텍스트를 찾는다"는 정확히 같은 따옴표를 의미합니다.
그것과 비슷하게 pattern:\2
는 두 번째 그룹의 콘텐츠를 의미합니다, pattern:\3
- 3번째 그룹, 기타 등등.
`?:`를 그룹에서 사용하면 그것을 참조할 수 없습니다. 그룹들은 캡처링 `(?:...)` 에서 그것을 제외하고 엔진에서 기억하지 않습니다.
```warn header="망치지 마세요: 패턴에서 pattern:\1
, 대체물에서: `pattern:$1`"
대체 문자열에서 달러 기호를 사용합니다: `pattern:$1`, 패턴 속에서 - 역슬래시 `pattern:\1`.
## 이름을 통한 역참조: `\k<name>`
정규식이 많은 괄호를 갖고 있다면 그들에게 이름을 지어주는 게 편합니다.
명명된 그룹을 참조하기 위해 `pattern:\k<name>`을 사용할 수 있습니다.
아래 예제에서 따옴표가 있는 그룹의 이름은 `pattern:?<quote>`이므로 역참조는 `pattern:\k<quote>`입니다:
```js run
let str = `He said: "She's the one!".`;
*!*
let regexp = /(?<quote>['"])(.*?)\k<quote>/g;
*/!*
alert( str.match(regexp) ); // "She's the one!"