首頁  >  文章  >  web前端  >  正規表示式(語法篇)

正規表示式(語法篇)

亚连
亚连原創
2018-05-21 09:35:441202瀏覽

下面我就為大家帶來一篇正規表示式(語法篇推薦)。現在就分享給大家,也給大家做個參考。

正規表示式的建構摘要

建構比對 

字元

x 字元x
\\ 反斜線字元
\0n 帶有八進位值0 的字元n (0 <= n <= 7)
\0nn 帶有八進位值0 的字元nn (0 <= n <= 7)
\0mnn 帶有八進位值0 的字元mnn(0 <= m <= 3、0 <= n <= 7)
\xhh 有十六進位值0x 的字元hh
\uhhhh 帶有十六進位值0x 的字元hhhh
\t 製表符('\u0009')
\n 新行(換行)符('\u000A ')
\r 回車符號('\u000D')
\f 換頁符號('\u000C')
\a 警報(bell) 符號('\u0007')
\ e 轉義符('\u001B')
\cx 對應於x 的控制符 

字元類別

[abc] a、b 或c(簡單類別)
[^abc] 任何字符,除了a、b 或c(否定)
[a-zA-Z] a 到z 或A 到Z,兩頭的字母包括在內(範圍)
[a-d[m-p]] a 到d 或m 到p:[a-dm-p](並集)
[a-z&&[def]] d、e 或f(交集)
[ a-z&&[^bc]] a 到z,除了b 和c:[ad-z](減)
[a-z&&[^m-p]] a 到z,而非m 到p:[a -lq-z](減去) 

預定義字元類別

. 任何字元(與行結束符號可能匹配也可能不匹配)
\ d 數字:[0-9]
\D 非數字: [^0-9]
\s 空白字元:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 單字字元:[a-zA-Z_0-9]
\W 非單字字元:[^\w] 

POSIX 字元類別(僅US- ASCII)
\p{Lower} 小寫字母字元:[a-z]
\p{Upper} 大寫字母字元:[A-Z]
\p{ASCII} 所有ASCII:[\x00-\x7F]
\p{Alpha} 字母字元:[\p{Lower}\p{Upper}]
\p{Digit} 十進位數:[0-9]
\p{Alnum} 字母數字字符:[\p{Alpha}\p{Digit}]
\p{Punct} 標點符號:!"#$%&'()* ,-./:;<=>?@[\] ^_`{|}~
\p{Graph} 可見字元:[\p{Alnum}\p{Punct}]
\p{Print} 可列印字元:[\p{Graph}\x20 ]
\p{Blank} 空格或製表符:[ \t]
\p{Cntrl} 控製字元:[\x00-\x1F\x7F]
\p{XDigit} 十六進制數字:[0-9a-fA-F]
\p{Space} 空白字元:[ \t\n\x0B\f\r] 

java.lang.Character 類別(簡單的java 字元類型)
\p{javaLowerCase} 等效於java.lang.Character.isLowerCase()
\p{javaUpperCase} 等效於java.lang.Character.isUpperCase()
\p{ javaWhitespace} 等效於java.lang.Character.isMirrored() 

#Unicode 區塊和類別的類別

\p{InGreek} Greek 區塊(簡單區塊)中的字元
\p{Lu} 大寫字母(簡單類別)
\p{Sc} 貨幣符號
\P{InGreek} 所有字符,Greek 區塊中的除外(否定)
[\p{L}&&[^\p{Lu}]]  所有字母,大寫字母除外(減) 

邊界匹配器

^ 行的開頭

$ 行的結尾
\b 單字邊界
\B 非單字邊界
\A 輸入的開頭
\ G 上一個符合的結尾
\Z 輸入的結尾,只用於最後的結束符號(如果有的話)
\z 輸入的結尾 

Greedy 數量詞

X? X,一次或一次也沒有

X* X,零次或多次
X X,一次或多次
X{n} X,剛好n次
X{n,} X,至少n 次
X{n,m} X,至少n 次,但不超過m 次 

Reluctant 數量詞

X?? X,一次或一次也沒有

X*? X,零次或多次
X ? X,一次或多次
X{n}? X,剛好n 次
X{n,}? X,至少n 次
X{n,m}? X,至少n 次,但不超過m 次 

Possessive 數量詞

X? X,一次或一次也沒有

X* X,零次或多次
X X,一次或多次
X{n} X,剛好n 次
X{n,} X,至少n 次
X{n,m} X,至少n 次,但不超過m 次 

Logical 運算子

XY X 後面跟著Y

X|Y X 或Y
(X) X,作為捕獲組 

Back 引用

\n 任何匹配的nth 捕獲組

引用
\ Nothing,但是引用以下字符
\Q Nothing,但是引用所有字符,直到\E
\E Nothing,但是結束從\Q開始的引用 

特殊構造(非捕獲)

(?:X) X,作為非捕獲組
(?idmsux-idmsux)  Nothing,但是將匹配標誌i d m s u x on - off
(?idmsux-idmsux:X)   X,作為帶有給定標誌i d m s u x on - off
的非捕獲組  (?=X) X,通過零寬度的正lookahead
(?!X) X,通過零寬度的負lookahead
(?<= X) X,經過零寬度的正lookbehind
(?(?>X) X,作為獨立的非捕獲組

-------------------------------------------------

反斜線、轉義和引用

#反斜線字元('\') 用於引用轉義構造,如上表所定義的,同時也用於引用其他將被解釋為非轉義構造的字元。因此,表達式 \\ 與單一反斜線匹配,而 \{ 與左括號匹配。

在不表示轉義構造的任何字母字元前使用反斜線都是錯誤的;它們是為將來擴展正規表示式語言保留的。可以在非字母字元前使用反斜線,不管該字元是否非轉義構造的一部分。

根據 Java Language Specification 的要求,Java 原始碼的字串中的反斜線被解釋為 Unicode 轉義或其他字元轉義。因此必須在字串字面值中使用兩個反斜線,表示正規表示式受到保護,並且不被 Java 字節碼編譯器解釋。例如,當解釋為正規表示式時,字串字面值 "\b" 與單一退格字元匹配,而 "\\b" 與單字邊界匹配。字串字面值 "\(hello\)" 是非法的,將導致編譯時錯誤;要與字串 (hello) 匹配,必須使用字串字面值 "\\(hello\\)"。

字元類別

字元類別可以出現在其他字元類別中,並且可以包含並集運算子(隱含)和交集運算子 (&&)。並集運算子表示至少包含其某個運算元類別中所有字元的類別。交集運算子表示包含同時位於其兩個運算元類別中所有字元的類別。

字元類別運算子的優先權如下所示,依照從最高到最低的順序排列:

##1     字面值轉義     \x

2     分組[...]
3     範圍a-z
4     並集合[a-e][i-u]
5     交集[a-z&&[aeiou]]

,元字元的不同集合上位於字元類別的內部,而非字元類別的外部。例如,正規表示式 . 在字元類別內部就失去了其特殊意義,而表達式 - 變成了形成元字元的範圍。

行結束符號

行結束符號 是一個或兩個字元的序列,標記輸入字元序列的行結尾。以下程式碼被辨識為行結束符:

新行(換行)符('\n')、

後面緊跟著新行符的回車符("\r\n")、
單獨的回車符號('\r')、
下一行字元('\u0085')、
行分隔符號('\u2028') 或
段落分隔符號('\ u2029)。
如果啟動 UNIX_LINES 模式,則新行符是唯一識別的行結束符號。

如果未指定 DOTALL 標誌,則正規表示式 . 可以與任何字元(行結束符除外)相符。

預設情況下,正規表示式 ^ 和 $ 忽略行結束符,僅分別與整個輸入序列的開頭和結尾相符。如果啟動 MULTILINE 模式,則 ^ 在輸入的開頭和行結束符號之後(輸入的結尾)才發生符合。處於 MULTILINE 模式時,$ 僅在行結束符號之前或輸入序列的結尾處匹配。

群組與擷取

擷取群組可以透過從左到右計算其開括號來編號。例如,在表達式((A)(B(C))) 中,有四個這樣的群組:

#1     ((A)(B(C)))

2     \A
3     (B(C))
4     (C)

組零總是代表整個表達式。

之所以這樣命名捕獲組是因為在匹配中,保存了與這些組匹配的輸入序列的每個子序列。捕獲的子序列稍後可以透過 Back 引用在表達式中使用,也可以在匹配操作完成後從匹配器取得。

與群組關聯的擷取輸入始終是與群組最近匹配的子序列。如果由於量化的緣故再次計算了組,則在第二次計算失敗時將保留其先前捕獲的值(如果有的話)例如,將字串"aba" 與表達式(a(b)?) 相匹配,會將第二組設定為"b"。在每個匹配的開頭,所有捕獲的輸入都​​會被丟棄。

以 (?) 開頭的組是純的非捕獲 組,它不捕獲文本,也不針對組合計進行計數。

上面是我整理給大家的,希望今後對大家有幫助。

相關文章:

關於在JS中閉包可被利用的常見場景有哪幾種? (圖文教程)

js中如何複製一個物件? (圖文教學)

利用js實作留言板的範例(程式碼奉上)

以上是正規表示式(語法篇)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn