\ w와 \ b 정규 표현식 메타 문자의 차이점


142

사람 사이의 차이를 설명 할 수 \b\w정규 표현식 메타 문자를? 이 두 메타 문자가 단어 경계에 사용된다는 것을 이해합니다. 이 외에도 다국어 콘텐츠에 어떤 메타 문자가 효율적입니까?


11
\w는 단어 문자\b나타내고 , 단어 문자와 비 단어 문자 사이 의 단어 경계 를 나타냅니다 . 그들은 같은 것이 아닙니다.
BoltClock

답변:


259

메타 문자 \b는 캐럿 및 달러 기호와 같은 앵커입니다. "word boundary" 라는 위치에서 일치 합니다. 이 일치는 길이가 0입니다.

단어 경계에 해당하는 세 가지 다른 위치가 있습니다.

  • 문자열의 첫 번째 문자 앞에 첫 번째 문자가 단어 문자 인 경우
  • 문자열의 마지막 문자 다음에 마지막 문자가 단어 문자 인 경우
  • 문자열에서 두 문자 사이에서 하나는 단어 문자이고 다른 하나는 단어 문자가 아닙니다.

간단히 말해 : 의 형식으로 정규식을 사용하여 "전체 단어 만" 검색 \b을 수행 할 수 있습니다 . "단어 문자는" 단어를 형성하는 데 사용할 수있는 문자입니다. "단어 문자"아닌 모든 문자는 "단어 이외 문자" 입니다.\bword\b

모든 맛에서 문자 [a-zA-Z0-9_]는 단어 문자입니다. 이것들은 속기 문자 클래스와도 일치합니다 \w. 풍미 비교에서 단어 경계에 대해 "아스키" 를 표시 하는 풍미는 이들을 단어 문자로만 인식합니다.

\w"단어 문자"를 의미하며 일반적으로 [A-Za-z0-9_]. 밑줄과 숫자가 포함되어 있습니다.

\B의 부정 버전입니다 \b. 그렇지 않은 \B모든 위치에서 일치합니다 \b. 효과적으로, \B두 단어가 아닌 문자 사이의 모든 위치와 두 단어가 아닌 문자 사이의 모든 위치에서 일치합니다.

\W[^\w]의 부정 버전의 줄임말 입니다 \w.


21

\w단어 문자와 일치합니다. \b한쪽에 단어 문자가 있고 다른쪽에 단어 문자가 아닌 위치 문자와 일치하는 너비가 0 인 일치 항목입니다. (단어가 아닌 것들의 예는 공백, 문자열의 시작과 끝 등을 포함합니다)

\w성냥 a, b, c, d, e, 및 f"abc def"
\b일치 (0부터 폭) 위치에 앞서 a, 후에 c, 이전 d및 이후 f"abc def"

참조 : http://www.regular-expressions.info/reference.html/


3
해당 문자가 문자열의 시작 / 끝에있는 경우 단어 문자와 문자열의 시작 또는 끝 사이에도 일치하므로 단어 문자가 아니라 단어 문자 사이의 경계라고 말하는 것이 더 정확합니다.
MRAB

5
여전히 옳지 않습니다. \b폭이 0 인 주장; 문자 와 일치하지 않고 위치 와 일치합니다 .
Alan Moore

10

@Mahender, 당신은 아마 \W(와 \w) 대신에 (의 ) 차이를 의미했을 것입니다 \b. 그렇지 않다면 위의 @BoltClock 및 @jwismar에 동의합니다. 그렇지 않으면 계속 읽으십시오.

\W단어가 아닌 문자와 일치하므로 단어 경계와 일치시키기 위해 쉽게 사용할 수 있습니다. 문제는 줄의 시작이나 끝과 일치하지 않는다는 것입니다. \b줄의 시작 또는 끝과도 일치하므로 단어 경계를 일치시키는 데 더 적합합니다. 대략적으로 말하면 (보다 숙련 된 사용자가 나를 여기서 바로 잡을 \b수 있음)이라고 생각할 수 있습니다 (\W|^|$). [편집 : @ Ωmega가 아래에 언급했듯이 \b길이가 0 인 일치이므로 (\W|^|$)엄격하게 정확하지는 않지만 diff를 설명하는 데 도움이됩니다.]

빠른 예 : 문자열의 경우 Hello World, .+\W일치합니다 Hello_(공간에)하지만 일치하지 않습니다 World. .+\b모두 일치하는 것 Hello등을 World.


일치하는 결과에 단어가 아닌 문자가 포함 되기 때문에 \b와 같은 의미에 동의하지 않습니다 . 이 사실을 여기서 확인할 수 있습니다 => regexr.com/3qf98 . (\W|^|$)(\W|^|$)
Victor

\b나를 위해, (?<=\W|^|$)패턴 이전과 패턴 (?=\W|^|$)이후에 사용될 때 와 동일한 것을 의미합니다 . 내가 말하는 것을 확인할 수 있습니다 => regexr.com/3qf9h . \b여기서 앵커 결과와 비교해 보십시오. => regexr.com/3qf9t
Victor

4
\b <= this is a word boundary.

단어 문자가 앞에 오지만 단어 문자가 앞에 오지 않는 위치 또는 단어 문자가 앞에 오지만 단어 문자가 앞에 오지 않는 위치에서 일치합니다.

\w <= stands for "word character". 

항상 ASCII 문자 [A-Za-z0-9_]와 일치합니다.

일치 시키려고하는 것이 있습니까?

초보자 또는 식욕을 돋우는 데 유용한 일부 정규식 웹 사이트.

나는 이것이 매우 유용한 책임을 발견했다.


5
이것은 좋은 대답이지만 \w항상 ASCII 문자와 동일하지는 않습니다. [A-Za-z0-9_]영숫자 유니 코드 코드 포인트와 일치하며 로케일이 적절하게 설정된 경우 8 비트 ISO-Latin-1 문자와 일치 할 수 있습니다. .
Tim Pierce

2

\w단어 경계 가 아니며 밑줄을 포함한 모든 단어 문자와 일치합니다 [a-zA-Z0-9_]. \b 입니다 : 단어의 경계, 즉,이 단어 및 영숫자가 아닌 문자 사이의 위치와 일치 \W또는 [^\w].

이러한 구현은 언어마다 다를 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.