\b 는 단어의 `경계` 위치를 가리킨다. (b = boundary 를 의미한다)
여기서 '단어'는 \w 와 일치하며 [a-zA-Z0-9_]와 동일하다.
즉, 단어와 단어가 아닌 문자와의 사이를 가리키는 것이다.
위치를 가리키는 것이기 때문에, 패턴이 일치하더라도 매치되는 길이는 0이다.
이런 이유 때문에 좀 헷갈리는데, 문장에서 각 단어의 경계를 표시해보면 쉽게 이해할 수 있다.
Raindrops on roses, and whiskers on kittens.
위 문장에서 단어의 경계, 즉 메타 문자 \b 는 아래와 같이 | 를 표시한 위치를 가리킨다.
|Raindrops| |on| |roses|, |and| |whiskers| |on| |kittens|.
이 문장에서 /\bo.\b/ 를 매치시킨 결과는 다음과 같다.
|Raindrops| |on| |roses|, |and| |whiskers| |on| |kittens|.
패턴이 단어의 경계 사이에 있는 o와 나머지 한 문자를 나타내기 때문이다.
\B 는 \b와 반대로 동작하는데, 이것도 각 위치를 표시해보면 이해하기 쉽다.
R|a|i|n|d|r|o|p|s o|n r|o|s|e|s, a|n|d w|h|i|s|k|e|r|s o|n k|i|t|t|e|n|s.
따라서, /\Bo.\B/ 와 매치시키면 아래와 같다.
R|a|i|n|d|r|o|p|s o|n r|o|s|e|s, a|n|d w|h|i|s|k|e|r|s o|n k|i|t|t|e|n|s.
주의할 것은, 정규식에서의 '단어'는 한글과 같은 2바이트 문자를 포함하지 않기 때문에,
한글의 경계는 \b로 처리할 수 없다는 것이다.
한글의 경계를 판단하려면, 전후방탐색으로 한글이 아닌 문자와의 경계를 판단하는 것이 좋다.
/(?<=[^가-힣])대상문자(?=[^가-힣])/
(자음과 모음까지 문자로 인식하려고 한다면, [^ㄱ-ㅎㅏ-ㅣ가-힣] 를 사용하면 된다)
자바스크립트와 같이 후방 탐색을 제공하지 않는 정규식 엔진이라면,
정규식으로만 걸러내는 것보다는, 해당 케이스에 맞는 별도의 로직을 작성하는 것이 좋겠다.
'코드 > JS' 카테고리의 다른 글
[JS] 익스플로러 버전 알기 (0) | 2015.09.12 |
---|---|
[JS] indexOf (0) | 2015.09.12 |
jQuery set Header for $.ajax (0) | 2015.05.22 |
Canvas를 Png 로 서버 저장 (0) | 2015.05.22 |
함수의 프로토타입 속성 (0) | 2015.04.21 |