正規表現

正規表現にて単語単位で区切るには「\b」| 位置のマッチに注意

正規表現で単語区切りをする方法

正規表現での単語区切りは「\b」

正規表現での単語区切りは「\b」を用いて表します。このときの「\b」は半角スペースやタブといった空白文字にマッチするわけではなく、空白文字のある位置にマッチしています。

行頭を表す「^」行末を表す「$」が文字ではなく場所にマッチするのと同じように、「\b」は文字の区切り位置にマッチします。

// サンドの後で単語が区切れる場合にマッチ
サンド\b

// 検索対象の文字列
サンド サンドパン // サンドの後に半角スペース
サンド サンドパン // サンドの後に全角スペース
サンド サンドパン // サンドの後にタブ
サンド
サンドパン // サンドの後に改行

// 結果
すべての「サンド」にヒット

画像のように「サンド」の文字にはマッチしているものの、「サンド 」や「サンド 」のように「\b」に該当する文字にはマッチしていません。これは半角スペースなどの空白文字それ自体にマッチしているのではなく、位置にマッチしているからです。

単語区切り以外の文字は「\B」

正規表現で単語区切り以外の文字を表現したい場合には「\B」を用います。単語区切りを表す「\b」を大文字の「\B」にするとちょうど反対の意味を表すようになっています。「\B」の場合も文字にマッチするわけではなく、位置にマッチしているので注意しましょう。

// サンドの後で単語が区切れる場合にマッチ
サンド\B

// 検索対象の文字列
サンド サンドパン // サンドの後に半角スペース
サンド サンドパン // サンドの後に全角スペース
サンド サンドパン // サンドの後にタブ
サンド
サンドパン // サンドの後に改行

// 結果
すべての「サンド」パンにヒット

画像では「サンドパン」の「サンド」にのみマッチしています。また位置にマッチしているので「サンドパ」のようにサンドの後ろの文字はマッチする対象に含まれていない点に注目です。

空白文字もマッチさせたいなら「\s」

「\b」で2単語以上はつなげない

正規表現にて2単語以上の区切りを表現するために「\b」でつなげることは避けましょう。「\b」は位置にマッチしているのであって、半角スペースなどにマッチしているわけではないためです。例を見てみましょう。

// 「サンド」と「サンドパン」の一連の文字列を抽出したい
サンド\bサンドパン

// 検索対象の文字列
サンド サンドパン // サンドの後に半角スペース
サンド サンドパン // サンドの後に全角スペース
サンド サンドパン // サンドの後にタブ
サンド
サンドパン // サンドの後に改行

// 結果
マッチせず

「\b」は位置にマッチするなため、「サンド\bサンドパン」と記載すると次のような矛盾が発生します。

  • 「\b」が間に挟まっているため「サンド サンドパン」のように区切りが必要
  • 「\b」は位置にしかマッチしないため抽出される文字自体は「サンドサンドパン」としたい

よって、2単語以上をつなぎ間の空白文字もあわせてマッチさせたい場合には「\b」は向いていません。

「\s」なら2単語以上でもOK

もし区切りの文字にもマッチさせたいのであれば、空白文字を表す「\s」を使いましょう。「\b」と異なり「\s」は空白文字そのものにマッチするので2単語以上の接続であっても探し出せます。

// 「サンド」と「サンドパン」の一連の文字列を抽出したい
サンド\sサンドパン

// 検索対象の文字列
サンド サンドパン // ◯
サンド サンドパン // ×
サンド サンドパン // ◯
サンド
サンドパン // ◯

// 結果
3つにはマッチ

画像のとおり半角スペースやタブ、改行を含んでいても一連の文字列としてマッチしてくれます。ただし「\s」には全角スペースは含まれないので使う際には注意しましょう。