正則表達式-經常使用構造子列表

字符

    表示單個字符。例如a,它將匹配字符串中第一次出現的字符a;它也能夠匹配第二個 a,這必須是你告訴正則表達式引擎從第一次匹配的地方開始搜索。正則表達式

    可使用特殊字符序列表明某些不可顯示字符。測試

構造 匹配
B 字符B
\xhh 十六進制值爲oxhh的字符
\uhhhh 十六進制值爲oxhhhh的Unicode字符
\t 製表符Tab:(‘\u0009’) 
\r 回車符:(‘\u000D’)
\n 換行符:(‘\u000A’)
\f 換頁符:(‘\u000C’)
\e 轉義符(Escape):(‘\u001B’)

字符集

    字符集是由一對括號[]括起來的字符集合。使用字符集,能夠告訴正則表達式引擎僅僅匹配多個字符中的一個。
spa

    字符集能夠出如今其它字符集中,而且能夠包含並集運算符(隱式)和交集運算符 (&&)。
code

構造 匹配
[abc] a、b或c(等效於a|b|c)
[^abc] 除了a、b或c的任何字符(否認)
[a-zA-Z] a到z或A到Z的任何字符(範圍)
[abc[hij]] a、b、c、h、i或j,等效於a|b|c|h|i|j(並集)
[a-z&&[hij]] h、i或j(交集)


    並集和交集的應用示例以下:字符串

    [a-c[h-j]]table

    a到c或h到j的任何字符(並)test

    [a-z&&[^hij]]擴展

    a到z,除了h、i、j(減去),等效於[a-gk-z]搜索

    [a-z&&[^h-j]]引用

    a到z,而非h到j(減去),等效於[a-gk-z]


預約義字符集

    預約義字符集能夠用在方括號以內或以外。

    例如\s\d匹配一個空白符後面緊跟一個數字;[\s\d]匹配單個空白符或數字。

構造 匹配
\d 數字:[0-9]
\D 非數字:[^0-9]
\s 空白字符:空格、製表、回車、換行、換頁
\S 非空白字符:[^\s]
\w 單詞字符:[a-zA-Z_0-9]
\W 非單詞字符:[^\w]

邊界匹配符

構造 匹配
^ 輸入序列的開始
當啓用多行模式後,還能夠匹配行的開始
$ 輸入序列的結尾
當啓用多行模式後,還能夠匹配行的結尾
\b 單詞邊界
  • \b匹配的是位置,這種匹配是0長度的

  • \b匹配一個「字母數字下劃線」序列的開始和結束位置,在開始位置前面的字符或結束位置後面的字符不能是字母、數字或下劃線

\B 非單詞邊界:[^\b]
\B匹配的位置是兩個「單詞字符」之間或兩個「非單詞字符」之間的位置
\G 上一個匹配的結尾

邏輯操做符

構造 匹配
XY X後跟Y
X|Y X或Y
匹配分支條件時,將會從左到右地測試每一個條件,若是知足了某個分支的話,就不會去再管其它的條件了。例如\d{5}|\d{5}-\d{4},只會匹配5位數字以及9位數字的前5位
(X) 捕獲組(capturing group)。能夠在表達式中用\i引用第i個捕獲組

量詞

    量詞描述了一個模式吸取輸入文本的模式。

  • 貪婪型:量詞老是貪婪的,除非有其它的選項被設置。貪婪表達式會爲全部可能的模式發現儘量多的匹配。

  • 懶惰型:懶惰型表達式匹配知足模式所需的最少字符數。

  • 佔有型:目前,佔有型量詞只在Java語言中可用。當正則表達式被應用於字符串時,它會產生至關多的狀態,以便在匹配失敗時能夠回溯。而佔有型量詞並不保存這些中間狀態,所以它能夠防止回溯。它們經常用來防止正則表達式失控,所以可使正則表達式執行起來更有效。

貪婪型 懶惰型 佔有型 如何匹配
X? X?? X?+ 0次或1次X(等效於X{0,1})
事實上表示前導字符是可選的
X* X*? X*+ 0次或屢次X(等效於X{0,} )
事實上表示前導字符能夠出現任意次數
X+ X+? X++ 1次或屢次X(等效於X{1,} )
事實上表示前導字符至少重現1次
X{n} X{n}? X{n}+ 剛好n次X
X{n,} X{n,}? X{n,}+ 至少n次X
X{n,m} X{n,m}? X{n,m}+ X至少n次,且不超過m次


    量詞的貪婪性

    量詞?+*會致使正則表達式引擎儘量的重複前導字符。只有當這種重複會引發整個正則表達式匹配失敗的狀況下,引擎會進行回溯。也就是說,它會放棄最後一次的「重複」,而後處理正則表達式餘下的部分。

    例如,用一個正則表達式匹配一個HTML標籤。

    輸入字符串爲」This is a <EM>first</EM> test」,正則表達式<.+>返回」<EM>first</EM>」。這是由於+是貪婪性的。

    讓咱們來看看正則引擎的處理過程。

    正則表達式的第一個符號是「<」,這是一個字符;第二個符號是「.」,匹配了字符「E」;第三個符號是「+」,它能夠一直能夠匹配後面的字符,直到一行的結束;而後遇到了換行符,匹配失敗(「.」不匹配換行符)。因而引擎開始對下一個正則表達式符號進行匹配,也即試圖匹配「>」。到目前爲止,正則表達式「<.+」已經匹配了「<EM>first</EM> test」。引擎會試圖將「>」與換行符進行匹配,結果失敗了。因而引擎進行回溯,「<.+」匹配「<EM>first</EM> tes」,因而引擎將「>」與「t」進行匹配,顯然仍是會失敗。這個過程繼續,直到「<.+」匹配「<EM>first</EM」,「>」與「>」匹配。最後引擎找到了一個匹配的部分「<EM>first</EM>」。

    由於正則導向的引擎是「急切的」,因此它會急着報告它找到的第一個匹配。而不是繼續回溯,即便可能會有更好的匹配,例如「<EM>」。因此因爲「+」的貪婪性,使得引擎返回了一個最長的匹配。


    可使用下列方式來解決量詞的貪婪性帶來的問題。

  • 用懶惰性取代貪婪性。

    輸入字符串爲」This is a <EM>first</EM> test」,正則表達式<.+?>返回」<EM>」。

    讓咱們再來看看正則引擎的處理過程。

    正則表達式符號「<」會匹配素如字符串的第一個「<」。下一個正則符號是「.」。此次是一個懶惰的「+?」來重複上一個字符,它會盡量少的重複上一個字符。所以引擎匹配「.」和字符「E」,而後用「>」匹配「M」,結果失敗了。引擎會進行回溯,和上一個例子不一樣,由於是惰性重複,因此引擎是擴展惰性重複而不是減小;因而「<.+」如今被擴展爲「<EM」。引擎繼續匹配下一個符號「>」。此次獲得了一個成功匹配。引擎因而報告「<EM>」是一個成功的匹配。

  • 惰性擴展的一個替代方案。

    輸入字符串爲」This is a <EM>first</EM> test」,正則表達式<[^>]+>返回」<EM>」。

    這是一個更好的替代方案。能夠用一個貪婪重複與一個取反字符集<[^>]+>。之因此說這是一個更好的方案在於使用惰性重複時,引擎會在找到一個成功匹配前對每個字符進行回溯。而使用取反字符集則不須要進行回溯。

相關文章
相關標籤/搜索