正規表現の\ bと\ Bの違い


103

私は正規表現の本を読んでいて、この例に出くわしました\b

猫は食べ物を部屋中に散らばった。

regexを使用\bcat\bすると、単語は一致しますcatが、catin は一致しませんscattered

\B著者の場合、次の例を使用します。

9桁のIDをそのまま入力してください

あなたの色に表示されます-コード化されたパスキー。

単語間の正規表現\B-\B一致を使用します。使用する一方では一致するでをして。-color - coded\b-\b-nine-digitpass-key

最初の例で\b分離に使用catし、2番目の例で\B分離するのは-どうしてですか?\b2番目の例で使用すると、以前とは逆になります。

違いを説明してください。

編集:また、誰でも新しい例で説明できますか?

回答:


84

混乱は、あなたの考えが\bスペースと一致していることに起因します(おそらく「b」が​​「空白」を示唆しているため)。

\b単語の最初または最後の空の文字列に一致します。 \B単語の先頭または末尾にない空の文字列に一致します。ここで重要なのは、「-」は単語の一部ではないということです。の両側に単語の境界があるため、<left>-<right>一致\b-\bします-。一方<left> - <right>(スペースに注意)、ダッシュの両側に単語の境界はありません。単語の境界は、左右に1スペース分です。

一方、\bcat\b単語の境界を検索すると、より直感的に動作し、期待どおりに「cat」と一致します。


2
はい、\ bを空白と混同していました。しかし、私はまだ少し混乱しています。もう1つの例をお願いできますか?
stirredo

3
重要なのは-、単語の一部とは見なされないことです。同様に、!は単語の一部ではありません。したがって、再び\b!\b「uunet!iamold」に一致しますが、「Wow!You are」には一致しません。あなたはregexpal.comでこれを試すことができます。
andrewdski

@andrewdski私の場合、\ bは句読点にも対応します... 1987894、3219800で\ b [A-Z0-9] + \ bを試しました。234567、345261。正常に機能し、数字しか取得できません
gunzapper

1
正規表現の作品は、文字(a〜zおよびA〜Z)、数字、および「_」(アンダースコア)で構成されていることを追加するだけです。他のすべては言葉ではありません。
Maralc 2015

誰かがこのラインを詳しく説明できますか\B matches the empty string not at the beginning or end of a word
アルン・ゴウダ

68

\bゼロ幅のワード境界です。具体的には:

単語文字(\ wと一致するもの)と非単語文字([^ \ w]または\ Wと一致するもの)の間の位置、および最初の文字列の場合は文字列の最初または最後に一致します。および/または文字列の最後の文字は単語文字です。

例:.\b試合c中にabc

\Bゼロ幅の非ワード境界です。具体的には:

2つの単語文字の間の位置(つまり、\ w \ wの間の位置)と、2つの単語以外の文字の間の位置(つまり、\ W \ W)で一致します。

例:\B.\B試合b中にabc

より優れた正規表現情報については、regular-expressions.infoを参照してください


10
ゼロ幅は定義の重要な部分であるため、+ 1。幅がゼロでない場合は、パターンの一致部分にある単語/非単語文字も取得します。
Ben Hocking

5
つまり、\ Bは\ Wと\ Wの間、または\ wと\ wの間のスポットに一致しますが、\ Wと\ wの間は一致しません。

1
この回答は、「アンカー」の下のスタックオーバーフローの正規表現に関するFAQに追加されました。
aliteralmind 2014

1
@stephenhuh string.match()は、グローバルフラグを追加しない限り、最初の一致のみを返しますg"abc def".match(/\b./g)returns['a', ' ', 'd']
Bohemian

1
これがより良い答えだと思います。混乱を解消してくれるので、私も認められるはずです。ここで学ぶべき多くのこと。
ウルフ

37

別の例で:

検索対象の文字列とパターンが '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は、キャレットやドル記号のようなアンカーです。「単語境界」と呼ばれる位置で一致します。この一致は長さがゼロです。

単語の境界と見なされる3つの異なる位置があります。

  • 文字列の最初の文字の前、最初の文字が単語の場合。
  • 文字列の最後の文字の後、最後の文字が単語文字の場合。
  • 文字列内の2つの文字の間。一方は単語文字で、もう一方は単語文字ではありません。

\ Bは\ bの否定バージョンです。\ Bは、\ bが一致しないすべての位置で一致します。実際には、\ Bは2つの単語文字間の任意の位置と、2つの非単語文字間の任意の位置で一致します。

出典:http : //www.regular-expressions.info/wordboundaries.html


3

\b単語の境界に一致します。\B非単語境界に一致し、@ Alan Mooreに訂正してくれてありがとう!)と同等です。どちらもゼロ幅です。[^\b](?!\b)

詳細については、http://www.regular-expressions.info/wordboundaries.htmlを参照してください。このサイトは、多くの基本的な正規表現の質問に非常に役立ちます。


4
\Bはと同等ではありません[^\b]。文字クラスは、([...]または[^...]ゼロ幅アサーションのようにしながら)、正確に一つの文字を消費\bし、\B何を消費しません。\b文字クラスを入れると、完全に異なる意味[\b]になります。バックスペースと[^\b]一致し、バックスペース以外のすべての文字と一致します。 \Bは本当にと同等(?!\b)です。
アランムーア

@Alanありがとう、あなたは完全に正しいです-私がそれを書いたとき、私は今朝起きていませんでした。修繕。
マットボール

4
...しかし、誰もがバックスペースに一致させたいと思う理由は私を超えています。:D
アランムーア

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 X I X I 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

出典 ©Copyright RexEgg.com

単語の境界:\ b *

単語境界\ bは、片側が単語文字(通常は文字、数字、またはアンダースコアです。ただし、エンジン間のバリエーションについては以下を参照)であり、反対側が単語文字ではない(たとえば、文字列またはスペース文字)。

したがって、正規表現の\ bcat \ bは、黒猫の猫と一致しますが、緊張症、tomcat、または証明書とは一致しません。境界の1つを削除すると、\ bcatはcatfishのcatと一致し、cat \ bはtomcatのcatと一致しますが、その逆はありません。もちろん、どちらもそれだけで猫にマッチします。

単語境界ではない:\ B

\ Bは、\ bが一致しないすべての位置に一致します。したがって、以下と一致します。

neitherどちらの側も単語文字でない場合、たとえば文字列$ =(@-%++)の任意の位置(文字列の先頭と末尾を含む)

both両側が単語文字である場合、たとえば、HiのHとiの間。

これはあまり役に立たないように見えるかもしれませんが、\ Bが必要なだけの場合もあります。例えば、

✽\ Bcat \ Bは、証明書のように単語の文字で完全に囲まれた猫を検索しますが、それ自体ではなく、単語の最初または最後にもありません。

✽cat \ Bは、証明書とナマズの両方で猫を検索しますが、tomcatでも単独でも検索しません。

✽\ Bcatは、証明書とTomcatの両方で猫を検出しますが、ナマズでも単独でも見つかりません。

✽\ 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、最初の例では一致します。猫の横に一致するように単語の境界があります。\b

同様のルールが他の人にも適用されます。\W否定的で\w \UPPER CASEある否定的である\LOWER CASE

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.