Steven Levithan 씨가 while 루프와 replace 메소드를 이용한 중첩 패턴을 제거하는 간단한 방법에 대해 작성하셨습니다.

[code:js]
var str = "abc&lt;1&lt;2<>3>4>def";
 
while (str != (str = str.replace(/<[^<>]*>/g, "")));
 
// str -> "abcdef"
주의할 것은 이 한줄에 있는 정규식이 중첩 패턴을 전혀 다루지 않는다는 것입니다. while 루프의 조건문은 <..>를(내부에 패턴이 없는 꺽쇠) 공백 문자열로 치환해버립니다. 이는 정규식이 더 이상 일치하지 않을 때까지 안쪽에서 바깥쪽으로 반복됩니다. 이 점에서, 치환 결과는 대상 문자열과 같아지고 루프는 종료됩니다.
[code:js]
var str = "abc(d(e())f)(gh)ijk()",
    re = /\([^()]*\)/,
    output = [],
    match, parts, last;
 
while (match = re.exec(str)) {
    parts = match[0].split("\uFFFF");
    if (parts.length <2)
        last = output.push(match[0]) - 1;
    else
        output[last] = parts[0] + output[last] + parts[1];
    str = str.replace(re, "\uFFFF");
}
 
// output -> ["(d(e())f)", "(gh)", "()"]


from Remove Nested Patterns with One Line of JavaScript on Ajaxian
Posted by 행복한고니 트랙백 0 : 댓글 0