PHP—PCRERegex子組(子模式)

來源:互聯網
上載者:User
子組通過圓括弧分隔界定,並且它們可以嵌套。 將一個模式中的一部分標記為子組(子模式)主要是來做兩件事情:

將可選分支局部化。比如,模式cat(arcat|erpillar|)匹配 ”cat”, “cataract”, “caterpillar” 中的一個,如果沒有圓括弧的話,它匹配的則是 ”cataract”, “erpillar” 以及Null 字元串。

將子組設定為捕獲子組(向上面定義的). 當整個模式比對後, 目標字串中匹配子組的部分將會通過 pcre_exec()() 的 ovector 參數回傳給調用者。 左括弧從左至右出現的次序就是對應子組的下標(從 1 開始), 可以通過這些下標數字來擷取捕獲子模式比對結果。

比如,如果字串 ”the red king” 使用模式((red|white) (king|queen)) 進行匹配, 模式比對到的結果是 array(“red king”, ”red king”, “red”, “king”) 的形式, 其中第 0 個元素是整個模式比對的結果,後面的三個元素依次為三個子組匹配的結果。 它們的下表分別為 1, 2, 3。

事實上,圓括弧履行的兩種功能並不總是有用的。 經常我們會有一種需求需要使用子組進行分組, 但又不需要(單獨的)捕獲它們。 在子組定義的左括弧後面緊跟字串 ”?:” 會使得該子組不被單獨捕獲, 並且不會對其後子組序號的計算產生影響。比如, 如果字串 ”the white queen” 匹配模式 ((?:red|white) (king|queen)),匹配到的結果會是 array(“white queen”、“white queen”、“white queen”),的和 king|queen 這兩個子組。 捕獲子組序號的最大值是 99, 最大允許擁有的所有子組(包括捕獲的和非捕獲的)的最大數量為 200。

為了方便簡寫,如果需要在非捕獲子組開始位置設定選項, 選項字母可以位於 ? 和 : 之間,比如:

(?i:saturday|sunday)(?:(?i)saturday|sunday)

上面兩種寫法實際上是相同的模式。因為可選分支會從左至右嘗試每個分支, 並且選項沒有在子模式結束前被重設, 並且由於選項的設定會穿透對後面的其他分支產生影響,因此, 上面的模式都會匹配 ”SUNDAY” 以及 ”Saturday”。

在 PHP 4.3.3 中,可以對子組使用 (?P<name>pattern) 的文法進行命名。 這個子模式將會在匹配結果中同時以其名稱和順序(數字下標)出現, PHP 5.2.2中又增加了兩種味子組命名的文法: (?<name>pattern) 和 (?’name’pattern)。

有時需要多個匹配可以在一個Regex中選用子組。 為了讓多個子組可以共用一個後向引用數位問題, (?| 文法允許複製數字。 考慮下面的Regex匹配Sunday:

(?:(Sat)ur|(Sun))day

這裡當後向引用 1 空時Sun 儲存在後向引用 2 中. 當後向引用 2 不存在的時候 Sat 儲存在後向引用 1中。 使用 (?|修改模式來修複這個問題:

(?|(Sat)ur|(Sun))day

使用這個模式, Sun和Sat都會被儲存到後向引用1中。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.