2021年12月15日

単語境界(Word boundary): \b

単語境界 \b^$ と同様、テストです。

正規表現のエンジン(正規表現の検索を実装するプログラムモジュール)が \b に出くわすと、文字列内の位置が単語境界であるかを確認します。

単語の境界としては、次の3つの異なる位置があります:

  • 文字列の先頭。文字列の最初が、単語文字 \w の場合。
  • 文字列内の2つの文字の間。一方が単語文字 \w でもう一方はそうでない場合。
  • 文字列の最後。文字列の最後の文字が単語文字 \w の場合。

例えば、正規表現 \bJava\bHello, Java! で見つかり、Java は独立した単語です。が、Hello, JavaScript! では見つかりません。

alert( "Hello, Java!".match(/\bJava\b/) ); // Java
alert( "Hello, JavaScript!".match(/\bJava\b/) ); // null

文字列 Hello, Java! で、次の位置は \b に対応します:

したがって、次の理由によりパターン \bHello\b にマッチします:

  1. 文字列の先頭は最初の検査 \b にマッチします。
  2. 次に、単語 Hello がマッチします。
  3. 次に、o と非文字の間になるので、検査 \b が再びマッチします。

パターン \bJava\b もマッチします。が、\bHell\b はマッチしません(l の後に単語境界がないため)。また、Java!\b もマッチしません(感嘆符は単語文字 \w ではないため、その後に単語境界はありません)。

alert( "Hello, Java!".match(/\bHello\b/) ); // Hello
alert( "Hello, Java!".match(/\bJava\b/) );  // Java
alert( "Hello, Java!".match(/\bHell\b/) );  // null (マッチせず)
alert( "Hello, Java!".match(/\bJava!\b/) ); // null (マッチせず)

なお、単語だけでなく数字に対しても同様に \b が利用できます。

例えば、パターン \b\d\d\b は単独の2桁の数値を探します。言い換えると、スペースや句読点(あるいはテキストの開始/終了)といった \w とは異なる文字で囲まれた2桁の数値を探します。

alert( "1 23 456 78".match(/\b\d\d\b/g) ); // 23,78
alert( "12,34,56".match(/\b\d\d\b/g) ); // 12,34,56
単語境界 \b は非ラテンアルファベットに対しては機能しません

単語境界の検査 \b は、その位置の一方が \w であり、反対側が \w でないかをチェックします。

しかし、\w はラテン文字 a-z (あるいは数字またはアンダーススコア)を意味するので、キリル文字や象形文字など、他の文字では機能しません。

タスク

hours:minutes という形式の時間があり、09:00 のように時間と分はどちらも2桁とします。

文字列内でこの時間を見つける正規表現を作成してください: Breakfast at 09:00 in the room 123:456.

P.S. このタスクでは、まだ時間の正しさをチェックする必要はありません。そのため、25:99 も有効な結果とします。

P.P.S. 正規表現は 123:456 にマッチしないようにしてください。

答え: \b\d\d:\d\d\b.

alert( "Breakfast at 09:00 in the room 123:456.".match( /\b\d\d:\d\d\b/ ) ); // 09:00
チュートリアルマップ