1 분 소요

공백 문자 클래스

. 뉴 라인을 제외한 모든 문자들을 대표한다.

그렇다면 모든 공백 문자들은 어떻게 표현할 수 있을까?

const regex = /[\r\n\t\v\f]/
const regexClass = /\s

예시)

// [testcase]
//     whitespcae => (    )
const regex = / ^\s+/

공백 문자가 아닌 모든 문자들은?

const regex = /[^\r\n\t\v\f]
const regexClass = /\S/

예시)

// [testcase]
// this is the => (this)
const regex = / ^\S+/

기타 문자 클래스

\s whitespcae [\r\n\t\v\f]
\S not whitespace [^\r\n\t\v\f]
\d digit [0-9]
\D not digit [^0-9]
\w word character [0-9A-Za-z_]
\W not word character [^0-9A-Za-z_]
\b word boundary \b \w이전과 이후는 \W이거나 그\w
\B not word boundary 경계 앞 뒤가 둘 다 \w이거나 그 반대

단어 경계 문자

  • \b, \B는 문자를 소비하지 않는다
    • ^ and $와 비슷하게 어떤 문자를 매치하지는 않는다.

예시)

// [testcase]
// O That rose has a lovely stem! => (stem)
// X Look at that solar system!
const regex = /\bstem\b/

// [testcase]
// X That rose has a lovely stem!
// O Look at that solar system! => (stem)
const regex = /\Bstem\b/

// [testcase]
// X That rose has a lovely stem!
// X Look at that solar system!
// O Operationg systems are fascinationg => (stem)
const regex = /\Bstem\B/

\b 와 \W 차이점

  • 경계 문자는 경계 문자를 매치에 포함 시키지 않는다.
  • 즉 경계에 실제 문자가 없어도 경계가 동작함
    • 처음이거나 끝 일 때도..
// [testcase]
// O stem stem stem => (stem) (stem) (stem)
const regex = /\bstem\b/

// [testcase]
// X stem
// O stem => ( stem )
// 문자를 포함하기에 결국 최소 6자리이상의 문자가 필요하게 된다.
const regex = /\Wstem\W/

다른 예제

// [testcase]
// O stem stem! stem => (stem stem! stem)
// O _i => (_i)
// X pennsylvanias 6-5000
// 문자로 시작하고 숫자가 아닌 문자열
const regex = /^\w.*\D$/

문제

위의 예제를 통해 이메일은 어떻게 정규식으로 처리할 수 있을까?

// kyh0703.atester@nate.ad.com
const emailRegex = /^[\w\.]+@[\w\.]+\.[\w]+$/;

주의 사항

정규식에서 단어는 한글과 같은 2바이트 문자를 포함하지 않기 때문에 한글의 경계는 \b로 처리할 수 없다.

한글의 경계를 판단하려면, 전후방 탐색으로 한글이 아닌 문자와의 경계를 판단하는 것이 좋다.

` /(?<=[^가-힣])대상문자(?=[^가-힣])/`

(자음과 모음까지 문자로 인식하려고 한다면, [^ㄱ-ㅎㅏ-ㅣ가-힣] 를 사용하면 된다)

참조

정규식 단어 경계 메타 문자 \b의 정확한 이해

댓글남기기