快速入門
教學
工具和語言
範例
參考
書籍評論
正規表示式教學
簡介
目錄
特殊字元
不可列印字元
正規表示式引擎內部
字元類別
字元類別減法
字元類別交集
簡寫字元類別
句點
定位點
字元邊界
交替
可選項目
重複
群組和擷取
反向參照
反向參照,第 2 部分
命名群組
相對反向參照
分支重設群組
自由間距和註解
Unicode
模式修改器
原子群組
佔有量詞
前瞻和後顧
環顧,第 2 部分
將文字排除在比對之外
條件式
平衡群組
遞迴
子常式
無限遞迴
遞迴和量詞
遞迴和擷取
遞迴和反向參照
遞迴和回溯
POSIX 方括號表示式
零長度比對
持續比對
本網站的更多資訊
簡介
正規表示式快速入門
正規表示式教學
替換字串教學
應用程式和語言
正規表示式範例
正規表示式參考
替換字串參考
書籍評論
可列印 PDF
關於本網站
RSS 資訊和部落格
RegexBuddy—Better than a regular expression tutorial!

字元邊界

元字元 \b 是一個定位點,就像插入符號和美元符號。它會比對在稱為「字元邊界」的位置。這個比對是零長度的。

有三個不同的位置符合字元邊界

簡單來說:\b 允許您使用 \bword\b 形式的正規表示法執行「僅限完整字詞」搜尋。一個「字元字元」是一個可以用來形成字詞的字元。所有不是「字元字元」的字元都是「非字元字元」。

哪些字元是字元字元取決於您使用的正規表示法類型。在大部分類型中,與 簡寫字元類別 \w 相符的字元,就是字元邊界視為字元字元的字元。 Java 是個例外。Java 支援 \b 的 Unicode,但不支援 \w 的 Unicode。

除了下面討論的類型之外,大部分類型只有一個同時與字詞前和字詞後相符的元字元。這是因為字元之間的任何位置都不可能同時在字詞的開頭和結尾。只使用一個運算子可以讓您更輕鬆。

由於數字被視為字元字元,\b4\b 可以用來與不屬於較大數字的 4 相符。這個正規表示法與 44 sheets of a4 不相符。因此說「\b 與字母數字順序前後相符」比說「與字詞前後相符」更精確。

\B\b 的否定版本。 \B\b 不相符的每個位置相符。實際上,\B 與兩個字元字元之間的任何位置,以及兩個非字元字元之間的任何位置相符。

深入了解正規表示法引擎

讓我們看看當我們將正規表示法 \bis\b 套用於字串 This island is beautiful 時會發生什麼事。引擎從第一個字元 T 的第一個代幣 \b 開始。由於這個代幣長度為零,因此會檢查字元前的位置。 \b 在這裡相符,因為 T 是字元字元,而它前面的字元是字串開頭前的空白。引擎繼續執行下一個代幣:文字 i。引擎不會進展到字串中的下一個字元,因為前一個正規表示法代幣長度為零。 iT 不相符,因此引擎在下一字元位置重試第一個代幣。

\b 無法與 Th 之間的位置相符。它也不能與 hi 之間,以及 is 之間相符。

字串中的下一個字元是空白。 \b 在這裡會配對,因為空白不是單字字元,而前一個字元是。引擎會繼續使用 i,而它不會與空白配對。

前進一個字元並從第一個正規表示式代號重新開始,\b 會在字串中的空白和第二個 i 之間配對。繼續下去,正規表示式引擎會發現 i 會配對 i,而 s 會配對 s。現在,引擎會嘗試在 l 前面的位置配對第二個 \b。這會失敗,因為這個位置在兩個單字字元之間。引擎會回到正規表示式的開始,並前進一個字元到 island 中的 s。再次地,\b 無法配對,並會繼續執行直到到達第二個空白。它會在那裡配對,但配對 i 會失敗。

但是 \b 會在字串中第三個 i 前面的位置配對。引擎會繼續,並發現 i 會配對 i,而 s 會配對 s。正規表示式中的最後一個代號 \b 也會在字串中第三個空白前面的位置配對,因為空白不是單字字元,而它前面的字元是。

引擎已成功在我們的字串中配對單字 is,跳過 i 和 s 前面出現的兩次。如果我們使用正規表示式 is,它會配對 This 中的 is

Tcl 字首字尾

如上所述,大多數正規表示式風格都支援字首字尾。值得注意的例外是 POSIXXML Schema 風格,它們根本不支援字首字尾。 Tcl 使用不同的語法。

在 Tcl 中,\b 會比對反斜線字元,就像大多數正規表示式風格(包括 Tcl)中的 \x08\B 會比對 Tcl 中的單一反斜線字元,就像所有其他正規表示式風格(以及 Tcl)中的 \\

Tcl 使用字母「y」而非字母「b」來比對字詞邊界。 \y 會比對任何字詞邊界位置,而 \Y 會比對任何非字詞邊界的字元。這些 Tcl 正規表示式代碼比對的內容與 Perl 風格正規表示式風格中的 \b\B 完全相同。它們不會區分字詞的開頭和結尾。

Tcl 有另外兩個字詞邊界代碼,會區分字詞的開頭和結尾。 \m 僅比對字詞開頭。亦即,它會比對其左側為非字詞字元、右側為字詞字元的任何位置。如果字串中的第一個字元為字詞字元,它也會比對字串開頭。 \M 僅比對字詞結尾。它會比對其左側為字詞字元、右側為非字詞字元的任何位置。如果字串中的最後一個字元為字詞字元,它也會比對字串結尾。

除了 Tcl 本身之外,唯一支援 Tcl 風格字詞邊界的正規表示式引擎是 JGsoft 引擎。在 PowerGREPEditPad Pro 中,\b\B 是 Perl 風格字詞邊界,而 \y\Y\m\M 是 Tcl 風格字詞邊界。

在大部分情況下,缺乏 \m\M 標記並非問題。 \yword\y 僅尋找「word」的「完整字詞」出現,就像 \mword\M 所做的一樣。 \Mword\m 永遠無法配對任何地方,因為 \M 永遠不會配對在字元字元後的位置,而 \m 永遠不會配對在字元字元前的位置。如果您的正規表示式需要配對 \y 前後方的字元,您可以輕鬆地在正規表示式中指定這些字元應該是字元字元或非字元字元。如果您想配對任何字詞,\y\w+\y 會產生與 \m.+\M 相同的結果。使用 \w 取代句點會自動將第一個 \y 限制在字詞的開頭,並將第二個 \y 限制在字詞的結尾。請注意,\y.+\y 無法運作。此正規表示式會配對每個字詞,以及主旨字串中字詞之間的每個非字元字元序列。話雖如此,如果您的風格支援 \m\M,正規表示式引擎可以比 \y\w+\y 稍快地套用 \m\w+\M,視其內部最佳化而定。

如果您的正規表示式風格支援 前瞻和後顧,您可以使用 (?<!\w)(?=\w) 模擬 Tcl 的 \m,並使用 (?<=\w)(?!\w) 模擬 \M。儘管冗長許多,這些前瞻建構與 Tcl 的字詞邊界完全相同。

如果你的風味有前瞻但沒有後瞻,且也有 Perl 風格的字詞邊界,你可以使用 \b(?=\w) 模擬 Tcl 的 \m,以及 \b(?!\w) 模擬 \M\b 會在字詞的開頭或結尾做比對,而前瞻會檢查下一個字元是否為字詞的一部分。如果是,我們就在字詞的開頭。否則,我們就在字詞的結尾。

GNU 字詞邊界

針對 POSIX 正規表示式的 GNU 擴充功能 新增了對 \b\B 字詞邊界的支援,如上所述。GNU 也使用自己的語法來表示字詞開頭和結尾的邊界。\< 會在字詞開頭做比對,就像 Tcl 的 \m\> 會在字詞結尾做比對,就像 Tcl 的 \M

Boost 在使用 ECMAScript、延伸、egrep 或 awk 語法時,也會將 \<\> 視為字詞邊界。

POSIX 字詞邊界

POSIX 標準將 [[:<:]] 定義為字詞開頭的邊界,將 [[:>:]] 定義為字詞結尾的邊界。儘管語法是從 POSIX 方括號表示式 借來的,但這些標記是與字元類別無關且無法在字元類別中使用的字詞邊界。Tcl 和 GNU 也支援 POSIX 字詞邊界。PCRE 從 8.34 版開始支援 POSIX 字詞邊界。Boost 在其所有語法中都支援它們。