정규식에서 \ b와 \ B의 차이점


103

정규 표현식에 대한 책을 읽고 있는데 다음 예제를 보았습니다 \b.

고양이는 방 전체에 음식을 뿌렸다.

정규식 사용- \bcat\b단어는 일치 cat하지만 catin 은 일치 하지 않습니다 scattered.

들어 \B저자 다음 예제를 사용합니다 :

9 자리 ID를 그대로 입력하세요.

색상으로 구분 된 패스 키에 표시됩니다.

단어 사이에 정규식 \B-\B일치 -를 사용합니다 color - coded. \b-\b반면에를 사용 하면 -in nine-digitpass-key.

우리 \b가 분리 하기 위해 사용하는 첫 번째 예 cat\B분리 하기 위해 두 번째 사용 하는 이유는 -무엇입니까? \b두 번째 예제에서 사용하면 이전에 수행 한 것과 반대입니다.

저에게 차이점을 설명 해주세요.

편집 : 또한 누구든지 새로운 예를 들어 설명해 주시겠습니까?

답변:


84

혼란은 당신의 생각이 \b공백과 일치하기 때문에 발생합니다 (아마 "b"는 "공백"을 의미하기 때문일 것입니다).

\b단어시작 또는 끝에 있는 빈 문자열과 일치합니다 . \B단어의 시작이나 끝이 아닌 빈 문자열과 일치합니다. 여기서 핵심은 "-"가 단어의 일부가 아니라는 것입니다. 의 양쪽에 단어 경계가 있기 때문에 <left>-<right>일치 \b-\b합니다 -. 반면에 <left> - <right>(공백에 유의하십시오) 대시의 양쪽에 단어 경계가 없습니다. 단어 경계는 왼쪽과 오른쪽에 한 칸 더 있습니다.

반면에 \bcat\b단어 경계를 검색 할 때보다 직관적으로 동작하고 예상대로 "cat"과 일치합니다.


2
예, 저는 실제로 \ b와 공백을 혼동했습니다. 하지만 아직도 조금 혼란 스러워요. 한 가지 더 예를 들어도 될까요?
교반

3
핵심은 -단어의 일부로 간주되지 않는다는 것 입니다. 마찬가지로 !단어의 일부가 아닙니다. 다시 \b!\b"uunet! iamold"와 일치하지만 "Wow! You are"와는 일치하지 않습니다. regexpal.com 에서 이것을 시도해 볼 수 있습니다 .
andrewdski

@andrewdski 제 경우에는 \ b 구두점도 잡습니다 ... 1987894, 3219800에서 \ b [A-Z0-9] + \ b로 시도했습니다. 234567, 345261. 잘 작동합니다. 숫자 만 얻습니다
gunzapper 2014

1
정규식의 작업이 문자 (a–z 및 A–Z), 숫자 및 "_"[밑줄])로 구성된다는 점을 추가하면됩니다. 다른 모든 것은 단어가 아닙니다.
Maralc 2015-08-25

\B matches the empty string not at the beginning or end of a word
누군가이

68

\b너비가 0 인 단어 경계입니다. 구체적으로 특별히:

단어 문자 (\ w와 일치하는 모든 항목)와 비 단어 문자 ([^ \ w] 또는 \ W와 일치하는 항목) 사이의 위치 및 첫 번째 문자열 인 경우 문자열의 시작 및 / 또는 끝에서 일치합니다. 및 / 또는 문자열의 마지막 문자는 단어 문자입니다.

예 : .\b일치 cabc

\B너비가 0 인 단어가 아닌 경계입니다. 구체적으로 특별히:

두 단어 문자 사이의 위치 (예 : \ w \ w 사이의 위치)와 두 단어가 아닌 문자 사이의 위치 (예 : \ W \ W)에서 일치합니다.

예 : \B.\B일치 babc

더 좋은 정규식 정보는 regular-expressions.info 를 참조하십시오.


10
0 너비는 정의의 중요한 부분이기 때문입니다. 너비가 0이 아닌 경우 패턴의 일치하는 부분에서 해당 단어 / 단어가 아닌 문자도 가져옵니다.
Ben Hocking 2011

5
즉, \ B는 \ W와 \ W 사이 또는 \ w와 \ w 사이의 지점과 일치하지만 \ W와 \ w 사이에는 일치하지 않습니다.

1
이 답변은 "Anchors" 의 Stack Overflow Regular Expression FAQ 에 추가되었습니다 .
aliteralmind 2014

1
@stephenhuh string.match()반환에게 첫 번째 일치, 당신은 추가하지 않으면 글로벌 플래그 g: "abc def".match(/\b./g)리턴['a', ' ', 'd']
보헤미안

1
나는 이것이 더 나은 대답이라고 생각합니다. 나는 또한 혼란을 해결하기 때문에 받아 들여진 사람이어야한다. 여기서 배울 것이 훨씬 더 많습니다.
Wolf

38

다른 예 :

검색 할 문자열과 패턴이 'cat'인 것을 고려하십시오.

text = "catmania thiscat thiscatmaina";

이제 정의,

'\ b' 는 각 단어의 시작 또는 끝에서 패턴을 찾고 일치시킵니다.

'\ B' 는 각 단어의 시작 또는 끝에서 패턴을 찾거나 일치하지 않습니다.

다른 경우 :

사례 1 : 각 단어의 시작 부분

result = text.replace(/\bcat/g, "ct");

이제 결과는 "ctmania thiscat thiscatmaina"입니다.

사례 2 : 각 단어의 끝

result = text.replace(/cat\b/g, "ct");

이제 결과는 "catmania thisct thiscatmaina"입니다.

사례 3 : 처음에는 아님

result = text.replace(/\Bcat/g, "ct");

이제 결과는 "catmania thisct thisctmaina"입니다.

사례 4 : 끝이 아님

result = text.replace(/cat\B/g, "ct");

이제 결과는 "ctmania thiscat thisctmaina"입니다.

사례 5 : 시작도 끝도 아님

result = text.replace(/\Bcat\B/g, "ct");

이제 결과는 "catmania thiscat thisctmaina"입니다.

도움이 되었기를 바랍니다 :)


내가 틀렸다면 정정 해주세요.하지만 \ bcat \ b를 사용할 때 문자열이 다음과 같으면 "catcat is my cat"=> 첫 번째 단어 (catcat)가이 조건에 적용되었을 것입니다. 아니?.
Kosem

8

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

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

  • 첫 번째 문자가 단어 문자 인 경우 문자열의 첫 번째 문자 앞.
  • 문자열의 마지막 문자 뒤, 마지막 문자가 단어 문자 인 경우.
  • 하나는 단어 문자이고 다른 하나는 단어 문자가 아닌 문자열의 두 문자 사이.

\ B는 \ b의 부정 된 버전입니다 . \ B는 \ b가 아닌 모든 위치에서 일치합니다. 사실상 \ B는 두 단어 문자 사이의 모든 위치와 두 단어가 아닌 문자 사이의 모든 위치에서 일치합니다.

출처 : http://www.regular-expressions.info/wordboundaries.html


3

\b단어 경계와 일치합니다. \B비 단어 경계와 일치하며 ( 수정 을 위해 @Alan Moore 에게 감사드립니다 !)와 동일 합니다. 둘 다 너비0입니다.[^\b](?!\b)

자세한 내용은 http://www.regular-expressions.info/wordboundaries.html 을 참조하십시오. 이 사이트는 많은 기본 정규식 질문에 매우 유용합니다.


4
\B입니다 하지 동일합니다 [^\b]. 문자 클래스 ( [...]또는 [^...]제로 폭 주장과 같은 상태), 정확히 하나 개의 문자 소비 \b\B아무것도 소비하지 않습니다. \b문자 클래스에 넣으면 완전히 다른 의미를 갖습니다. [\b]백 스페이스와 [^\b]일치 하고 백 스페이스를 제외한 모든 문자 와 일치합니다 . \B실제로 (?!\b).
Alan Moore

@Alan 감사합니다, 당신은 완전히 맞습니다-오늘 아침 내가 그것을 썼을 때 나는 깨어 있지 않았습니다. 결정된.
Matt Ball

4
...하지만 왜 누군가가 백 스페이스를 일치시키고 싶어하는지는 저 밖에 있습니다. : D
Alan Moore

1

다음과 같은 문자열을 사용하십시오.

XIX IXI XX XI II IIXX XXII II XX -X X- XI IX -X- -IX -XI IX- XI- X_X _X-

참고 :이 경우 밑줄 (_)은 특수 문자로 간주되지 않습니다.

  1. /\bX\b/g 특수 문자 또는 공백으로 시작하고 끝나야합니다.

XIX IXI XX X I II IIXX XXII II XX - X XX -I I- XX - -I- XX -I I- XX -I- X_X _X-


  1. /\bX/g 특수 문자 또는 공백으로 시작해야합니다.

X IX IXI X X X I II IIXX X XII II X - X - X X - X -I IX - X - -I- X - X -I IX - X -I- X _X _X-


  1. /X\b/g 특수 문자 또는 공백으로 끝나야합니다.

XI X IXI X X X I II IIX X XXII II X - X - X X - X -I I- X - X - -I- X - X -I I- X - X -I- X_ X _ X -


  1. /\BX\B/g
    해야 하지 시작 하지 특수 문자 나 공백으로 종료

XIX I X I XX XI II II X X X X II II XX -X X- XI IX -X- -IX -XI IX- XI- X_X _X-


  1. /\BX/g해야 하지 특수 문자 나 공백으로 시작

XI XX 나 X X XI II II XX X X II II XX -X X- XI IX -X- -ix -xi IX- XI- X_ X _ X -


  1. /X\B/g특수 문자 또는 공백으로 끝나서 는 안됩니다.

X IX I X I X X XI II II X X XX II II XX -X X- XI IX -X- -IX -XI IX- XI- X _X _X-


  1. /\bX\B/g특수 문자 또는 공백으로 시작하고 끝나지 않아야 합니다.

X IX IXI X X XI II II X X X XII II XX -X X- XI IX -X- -IX -XI IX- XI- X _X _X-


  1. /\BX\b/g해야 하지 시작하고 특수 문자 나 공백으로 끝나야합니다

XI X IXI X X XI II IIX X XXII II XX -X X- XI IX -X- -ix -xi IX- XI- X_ X _ X -


1

출처 © 저작권 RexEgg.com

단어 경계 : \ b *

단어 경계 \ b는 한 쪽이 단어 문자 (일반적으로 문자, 숫자 또는 밑줄이지만 엔진 간의 변형은 아래 참조)이고 다른 쪽은 단어 문자가 아닌 위치와 일치합니다 (예 : 문자열 또는 공백 문자).

따라서 정규식 \ bcat \ b는 검은 고양이의 고양이와 일치하지만 catatonic, tomcat 또는 인증서에서는 일치하지 않습니다. 경계 중 하나를 제거하면 \ bcat은 catfish의 cat과 일치하고 cat \ b는 tomcat의 cat과 일치하지만 그 반대는 아닙니다. 물론 둘 다 자체적으로 고양이와 일치합니다.

단어 경계가 아님 : \ B

\ B는 \ b가 일치하지 않는 모든 위치와 일치합니다. 따라서 다음과 일치합니다.

✽ 어느 쪽도 단어 문자가 아닌 경우, 예를 들어 문자열 $ = (@-% ++) (문자열의 시작과 끝 포함)의 임의 위치

✽ 양쪽이 단어 문자 인 경우 (예 : Hi!에서 H와 i 사이)

이것은 그다지 유용하지 않은 것 같지만 때때로 \ B가 원하는 것입니다. 예를 들어

✽ \ Bcat \ B는 인증서에서와 같이 단어 문자로 완전히 둘러싸인 고양이를 찾지 만 그 자체로도, 단어의 시작이나 끝에서도 찾을 수 없습니다.

✽ cat \ B는 인증서와 메기 모두에서 고양이를 찾을 수 있지만 바람둥이에서나 자체적으로 고양이를 찾을 수 없습니다.

✽ \ Bcat은 인증서와 바람둥이 둘 다에서 고양이를 찾지 만 메기 나 그 자체로는 찾을 수 없습니다.

✽ \ Bcat | cat \ B는 인증서, 메기 또는 바람둥이와 같은 내장 된 상황에서 고양이를 찾지 만 그 자체로는 찾을 수 없습니다.


1

\ b는 단어 경계로 사용됩니다.

word = "categorical cat"

위의 단어에서 모든 "고양이"찾기

\ b없이

re.findall(r'cat',word)
['cat', 'cat']

\ b와 함께

re.findall(r'\bcat\b',word)
['cat']

0

\B되어 있지 \b부정적 \b

pass-key여기 옆에 단어 경계가 없으므로 첫 번째 예에서 -일치 \B합니다. cat 옆에 단어 경계가 있으므로 일치합니다.\b

유사한 규칙이 다른 사람들에게도 적용됩니다. \W음수 \w \UPPER CASE는 음수입니다.\LOWER CASE

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