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

從前一次比對的結尾繼續

錨點 \G 會在上次比對結束的位置進行比對。在第一次比對嘗試期間,\G 會在 字串的開頭 進行比對,就像 \A 一樣。

\G\w 套用到字串 test string 會比對到 t。再次套用會比對到 e。第 3 次嘗試會產生 s,而第 4 次嘗試會比對到字串中的第二個 t。第五次嘗試會失敗。在第五次嘗試期間,字串中唯一比對到 \G 的位置在第二個 t 之後。但該位置後面沒有字元,因此比對會失敗。

前一次比對的結尾與比對嘗試的開頭

在某些 regex 風格或工具中,\G 會在比對嘗試的開頭比對,而不是在前一次比對的結尾。這是 RubyJust Great Software 應用程式 的情況。在 EditPad Pro 中,\G 會在游標位置比對。當找到比對時,EditPad Pro 會選取比對,並將游標移到比對的結尾。結果是,\G 只有在您沒有在兩次搜尋之間移動游標時,才會在上次比對結果的結尾比對。總而言之,這在文字編輯器的環境中非常有意義。

如果您的正規表示式可以找到 零長度比對,則前一次比對的結尾和比對嘗試的開頭之間的區別也很重要。大多數 regex 引擎會在零長度比對後 在字串中前進。在這種情況下,比對嘗試的開頭在字串中比前一次比對嘗試的結尾多一個字元。.NETJavaBoost 會以這種方式前進,並在上次比對嘗試的結尾比對 \G。因此,當 .NET、Java 和 Boost 在零長度比對後前進時,\G 會無法比對。

Perl 的 \G 魔術

Perl 中,上次比對結束的位置是一個「神奇」值,會針對每個字串變數分別記住。該位置與任何正規表示式無關。這表示您可以使用 \G 讓 regex 在另一個 regex 停止的位置繼續在主旨字串中進行。

如果比對嘗試失敗,\G 的儲存位置會重設為字串的開頭。若要避免這種情況,請指定延續修飾詞 /c

所有這些對於讓多個正規表示式一起運作非常有用。例如,你可以用以下方式剖析 HTML 檔案

while ($string =~ m/</g) {
  if ($string =~ m/\GB>/c) {
    # Bold
  } elsif ($string =~ m/\GI>/c) {
    # Italics
  } else {
    # ...etc...
  }
}

while 迴圈中的正規表示式會搜尋標籤的開啟方括號,而迴圈內的正規表示式會檢查我們找到的標籤。這樣一來,你可以按照檔案中出現的順序剖析檔案中的標籤,而不用寫一個單一的大正規表示式來比對你感興趣的所有標籤。

\G 在其他程式語言中

這種彈性在大部分其他程式語言中並不存在。例如,在 Java 中,\G 的位置會由 Matcher 物件記住。Matcher 與單一正規表示式和單一主旨字串嚴密關聯。不過,你可以新增一行程式碼,讓第二個 Matcher 的比對嘗試從第一個 Matcher 的比對結束處開始。然後 \G 會比對這個位置。

比對嘗試的開始

通常,\A字串開頭錨點。但在 Tcl 中,錨點 \A 會比對比對嘗試的開頭,而不是字串的開頭。使用 GNU 風格 時,\<(反斜線反引號)會執行相同的動作。如果你只呼叫 Tcl 中的 regexp 或 GNU 函式庫中的 regexec() 一次,這不會造成任何差異。如果你在第一次比對後呼叫第二次比對,在字串的剩餘部分尋找另一個比對,這可能會造成差異。\A\< 會比對第一次比對的結尾,而不是像字串開頭錨點通常會做的那樣無法比對。奇怪的是,在 Tcl 或 GNU 的函式庫中,插入符號都沒有這個問題。