2021 年 12 月 12 日

字詞邊界:\b

字詞邊界 \b 是一種測試,就像 ^$

當正規表示法引擎(執行搜尋正規表示法的程式模組)遇到 \b 時,它會檢查字串中的位置是否為字詞邊界。

有三個不同的位置符合字詞邊界的資格

  • 在字串開頭,如果第一個字串字元是字詞字元 \w
  • 在字串中的兩個字元之間,其中一個是字詞字元 \w,另一個則不是。
  • 在字串結尾,如果最後一個字串字元是字元 \w

例如,regexp \bJava\b 會在 Hello, 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. 然後測試 \b 再次符合,因為我們在 o 和逗號之間。

因此樣式 \bHello\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 (no match)
alert( "Hello, Java!".match(/\bJava!\b/) ); // null (no match)

我們不僅可以用 \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(或數字或底線),因此測試不適用於其他字元,例如西里爾字母或象形文字。

任務

時間的格式為:時:分。時和分都有兩個數字,例如 09:00

製作一個 regexp 在字串中找出時間: 在 09:00 於 123:456 房間享用早餐。

附註:在這個任務中,還不需要檢查時間的正確性,所以 25:99 也可以是一個有效的結果。

再附註:正則表達式不應該符合 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
教學地圖

留言

留言前請先閱讀…
  • 如果您有改進建議,請 提交 GitHub 議題 或發起拉取請求,而不是留言。
  • 如果您無法理解文章中的某個部分,請詳細說明。
  • 若要插入幾行程式碼,請使用 <code> 標籤,對於多行程式碼,請將它們包覆在 <pre> 標籤中,對於超過 10 行的程式碼,請使用沙盒 (plnkrjsbincodepen…)