Steven Levithan 씨가 while 루프와 replace 메소드를 이용한 중첩 패턴을 제거하는 간단한 방법에 대해 작성하셨습니다.
from Remove Nested Patterns with One Line of JavaScript on Ajaxian
[code:js]
var str = "abc<1<2<>3>4>def";
while (str != (str = str.replace(/<[^<>]*>/g, "")));
// str -> "abcdef"
var str = "abc<1<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)", "()"]
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
'[IT] Web Tech' 카테고리의 다른 글
Safari 에서 뒤집기 (0) | 2008.06.10 |
---|---|
Acrobat.com: PDF와 Flash 함께하다 (1) | 2008.06.10 |
OpenAjax Conformance와 OpenAjax Registry에 대한 피드백 요청 (0) | 2008.06.10 |
BrowserPlus를 로컬에서 동작하도록 해킹하기 (0) | 2008.06.10 |
한 줄의 JavaScript로 중첩 패턴 제거 (0) | 2008.06.10 |
BeSlimed: Mootools로 만든 게임 (0) | 2008.06.10 |
SocialHistory.js: Spyjax 보다 더 (0) | 2008.06.10 |
Gears, 첫 돌을 맞다 (0) | 2008.06.06 |
GWT 1.5 RC 버전 릴리스 (0) | 2008.06.06 |
댓글을 달아 주세요