Skip to content

Latest commit

 

History

History
72 lines (44 loc) · 3.14 KB

File metadata and controls

72 lines (44 loc) · 3.14 KB

패턴 속 역참조: \N 과 \k

결과나 대체 문자열에서뿐만 아니라 패턴 자체에서도 콘텐츠의 그룹 캡처링 pattern:(...) 을 사용할 수 있습니다.

숫자를 통한 역참조: \N

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!"