정규표현식 \b \B의 단어 경계(word boundary)

단어 경계는 \w와 \W의 그 사이를 찾는 작업

정규표현식(regular expression)을 사용해 일치(match)하는 단어나 기호를 찾는 것은 매우 간단합니다.

My name is ABC.

ABC는 정규표현식 /ABC/를 사용하면 간단하게 찾을 수 있습니다.

그러나 다음 문자열에서 to를 찾기 위해 /to/를 사용하면 의도한 결과를 벗어납니다.

She told me not to go.

to가 포함된 모든 단어를 검색하는데요.

이 때 /b를 사용해 경계를 지정하면 원하는 부분만 찾을 수 있습니다.

그렇다면 /b의 정확한 기능은 무엇일까요?


1. /b의 기능

/b는 문자(\w에 해당하는 문자, a-z,A-Z,0-9,_)와 비(非)문자(\W에 해당하는 경우) 부분의 경계를 의미합니다.

이 부분의 이해가 어려울 수도 있는데요.

예를 들어 보겠습니다.

문자(\w로 표현): abcdefzhijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_
비문자(W로 표현) : 위 문자를 제외한 모든 기호

위와 같은 정의를 갖는 문자와 비문자 사이의 경계를 나타냅니다.

참고로 문자의 \w는 w가 소문자, 비문자의 \W는 대문자입니다.

띄워쓰기는 비문자에 해당하므로 /b를 사용해 단어의 경계를 정하고 원하는 결과를 만들 수 있는 것입니다.

그럼 다음 상황을 확인해보죠.

/\ba/g

위 표현식을 사용했을 때 다음 문자열에서 찾을 수 있는 결과는 무엇일까요?

-a

‘ a’

_a

aa

star

결과는 다음과 같으며 한 줄로 표현하겠습니다.

aa‘ _a aa star

-a에서 a가 선택되는 이유는 -가 비문자이며 a가 문자이므로 \b는 두 사이를 가리키기 때문입니다.

‘ a’에서도 a 앞의 띄워쓰기는 비문자, a는 문자이므로 \b는 두 사이를 가리킵니다.

_a에서 a가 선택되지 않는 이유는 _ 기호는 문자로 취급하며 a도 문자이기 때문입니다.(\w의 정의)

aa에서 a가 선택된 이유는 문자열 제일 앞 또는 제일 뒤가 문자면 \b의 조건에 해당한다고 정의하기 때문입니다.

따라서 위의 문장에서 to만 찾으려면 다음과 같은 표현식을 사용하면 됩니다.

/\bto\b/g

She told me not to go.

참고로 \b, \B는 경계만을 가리킬 뿐 실제 문자와 일치하는 것은 아니므로 결과에는 포함되지 않습니다.


2. /B의 기능

그렇다면 대문자로 표현되는 \b의 반대 기능 \B의 정의는 무엇일까요?

바로 비문자와 비문자 사이의 경계, 또는 문자와 문자 사이의 경계를 의미합니다.

!-! abc와 같은 비문자 사이에서 비문자(-)를 찾거나 문자 사이에서 문자(b)를 찾을 수 있습니다.

/\B-\B/g

!! ‘


3. 활용

\b, \B는 주로 단어 검색에 유용합니다.

이 기능의 명칭이 단어 경계(word boundary)이므로 용도는 명확합니다.

문자열 내 의도하지 않은 기호의 탐색이나 카멜케이스(CamelCase)등과 관련된 작업에도 사용할 수 있습니다.