JavaScript 정규식의 긍정형 전방 탐색과 부정형 전방 탐색
때때로 다음과 같은 유형의 문제를 해결해야 할 때가 있습니다:
문자열 'aaa'를 찾아 '!'로 바꾸되,
'aaa' 뒤에 'x'가 있을 때만 바꾸고,
'x' 자체는 바꾸지 않는 경우입니다.
만약 이 문제를 '직접적으로' 해결하려고 한다면,
성공하지 못할 것입니다:
'aaax baaa'.replace(/aaax/g, '!'); // '! baaa'를 반환하지만, 우리는 '!x baaa'를 원했습니다
전방 탐색
이 문제를 해결하려면, 'x'를 바꾸지 않아야 한다고
표현할 방법이 필요합니다. 이것은 특수 괄호 (?= )를
사용하여 수행되며, 이 괄호는 단순히 확인만 하고 자신은
포착하지 않습니다.
이 괄호를 긍정형 전방 탐색이라고 합니다.
긍정형이라고 하는 이유는 'x'(우리의 경우)가
반드시 있어야만 치환이 발생하기 때문입니다.
이 괄호를 사용하여 우리의 문제를 해결해 보겠습니다:
'aaax aaab'.replace(/aaa(?=x)/g, '!'); // '!x aaab'를 반환합니다
반대로 부정형 전방 탐색 - (?! ) - 도 있습니다.
이것은 어떤 것이 없어야 한다고 말합니다.
다음 예제에서는 'aaa' 뒤에 'x'가
'없을 때만' 치환이 발생합니다:
'aaax aaab'.replace(/aaa(?!x)/g, '!'); // 'aaax !b'를 반환합니다
후방 탐색
유사하게 긍정형 후방 탐색 - (?<= ) - 이 있습니다.
다음 예제에서는 'aaa' 앞에 'x'가 있을 때만
치환이 발생합니다:
'xaaa'.replace(/(?<=x)aaa/g, '!'); // 'x!'를 반환합니다
그리고 부정형 후방 탐색 - (?<! ) - 도 있습니다.
다음 예제에서는 'aaa' 앞에 'x'가 없을 때만
치환이 발생합니다:
'baaa'.replace(/(?<!x)aaa/g, '!'); // 'b!'를 반환합니다
실습 문제
함수 이름들을 포함하는 문자열이 주어졌습니다:
let str = 'func1() func2() func3()';
문자열에서 함수 이름들의 배열을 얻으세요.
태그가 포함된 문자열이 주어졌습니다:
let str = '<a href="" class="eee" id="zzz">';
이 태그의 속성 이름들의 배열을 얻으세요.
변수들이 포함된 문자열이 주어졌습니다:
let str = '$aaa $bbb $ccc xxxx';
달러 기호($) 앞에 있는 하위 문자열들을 얻으세요.