코드/JS

[정규표현식] \b, \B 의 정확한 이해

Yeah-Panda 2015. 7. 29. 11:36
출처 : http://ohgyun.com/392


\d 나 \w, \s 등과 같은 메타 문자들이 '특정 텍스트의 집합'을 매칭시키는 것과 다르게,
\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