首頁  >  文章  >  Java  >  java正規知識詳解

java正規知識詳解

尚
轉載
2019-11-29 13:11:332683瀏覽

java正規知識詳解

表達式意義:(建議:java影片教學

1、字元

x 字元x 。例如a表示字元a

\\ 反斜線字元。書寫時要寫為\\\\。 (註:因為java在第一次解析時,把\\\\解析成正則表達式\\,在第二次解析時再解析為\,所以凡是不是1.1列舉到的轉義字符,包括1.1的\\,而又帶有\的都要寫兩次)

\0n 帶有八進位值0的字元n (0 \0nn 帶有八進位值0的字元nn (0 \0mnn 帶有八進位值0的字元mnn(0 \xhh 帶有十六進位值0x的字元hh

\uhhhh 帶有十六進位值0x的字元hhhh

\t 製表符('\u0009')

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

\r 回車符號('\u000D')

\ f 換頁符號('\u000C')

\a 警報(bell) 符號('\u0007')

\e 轉義符號('\u001B')

#\cx 對應於x 的控制符

2、字元類別

[abc] a、b或c(簡單類別)。例如[egd]表示包含有字元e、g或d。

[^abc] 任何字符,除了a、b或c(否定)。例如[^egd]表示不包含字符e、g或d。

[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](減)

3 、預定義字元類別(注意反斜線要寫兩次,例如\d寫為\\d)任何字元(與行結束符號可能匹配也可能不符)

\d 數字:[0 -9]

\D 非數字: [^0-9]

\s 空白字元:[ \t\n\x0B\f\r]

\ S 非空白字元:[^\s]

\w 單字字元:[a-zA-Z_0-9]

\W 非單字字元:[^\w]

4.POSIX 字元類別(僅US-ASCII)(注意反斜線要寫兩次,例如\p{Lower}寫為\\p{Lower})

\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]

5.java.lang.Character 類別(簡單的java 字元類型)

\p{javaLowerCase} 等效於java.lang.Character.isLowerCase( )

\p{javaUpperCase} 等效於java.lang.Character.isUpperCase()

\p{javaWhitespace} 等效於java.lang.Character.isWhitespace()

\p{javaMirrored} 等價於java.lang.Character.isMirrored()

6.Unicode 區塊和類別的類別

\p{InGreek} Greek 區塊(簡單區塊)中的字符

\p{Lu} 大寫字母(簡單類別)

\p{Sc} 貨幣符號

\P{InGreek} 所有字符,Greek 塊中的除外(否定)

[\p{L}&&[^\p{Lu}]] 所有字母,大寫字母除外(減去)

7、邊界匹配器

^ 行的開頭,請在正規表示式的開始處使用^。例如:^(abc)表示以abc開頭的字串。注意編譯的時候要設定參數MULTILINE,如 Pattern p = Pattern.compile(regex,Pattern.MULTILINE);

$ 行的結尾,請在正規表示式的結尾處使用。例如:(^bca).*(abc$)表示以bca開頭以abc結尾的行。

\b 單字邊界。例如\b(abc)表示單字的開始或結束包含有abc,(abcjj、jjabc 都可以匹配)

\B 非單字邊界。例如\B(abc)表示單字的中間包含有abc,(jjabcjj匹配而jjabc、abcjj不符)

\A 輸入的開頭

\G 上一個符合的結尾(個人感覺這個參數沒什麼用)。例如\\Gdog表示在上一個符合結尾處尋找dog如果沒有的話則從開頭查找,注意如果開頭不是dog則不能匹配。

\Z 輸入的結尾,僅用於最後的結束符號(如果有的話)

#行結束符號是一個或兩個字元的序列,標記輸入字元序列的行結尾。

以下程式碼被辨識為行結束符:

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

‐後面緊跟著新行符的回車符("\r\n")、

‐單獨的回車符號('\r')、

‐下一行字元('\u0085')、

‐行分隔符號('\u2028') 或

‐段落分隔符號('\u2029)。

\z 輸入的結尾

當編譯模式時,可以設定一個或多個標誌,例如

Pattern pattern = Pattern.compile(patternString,Pattern.CASE_INSENSITIVE Pattern .UNICODE_CASE);

下面六個標誌都是支持的:

‐CASE_INSENSITIVE:匹配字元時與大小寫無關,此標誌預設只考慮US ASCII字元。

‐UNICODE_CASE:當與CASE_INSENSITIVE結合時,使用Unicode字母匹配

‐MULTILINE:^和$匹配一行的開始和結尾,而不是整個輸入

‐UNIX_LINES : 當在多行模式下匹配^和$時,只將'\n'看作行終止符

‐DOTALL: 當使用此標誌時,.符號匹配包括行終止符在內的所有字元

‐CANON_EQ: 考慮Unicode字元的規範等價

8、Greedy 數量詞

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

X* X,零次或多次

X X,一次或多次

X{n} X,恰好n 次

X{n,} X,至少n 次

X{n,m} X,至少n 次,但是不超過m 次

9.Reluctant 數量詞

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

X*? X,零次或多次

X ? X,一次或多次

X{n}? X,剛好n 次

#X{n,}? X,至少n 次

X{n,m}? X,至少n 次,但不超過m 次

10、Possessive 數量詞

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

X* X,零次或多次

X X,一次或多次

X{n} X,恰好n 次

X{n,} X,至少n 次

X{n,m} X,至少n 次,但不超過m 次

Greedy, Reluctant,Possessive的區別在於:(注意僅限於進行.等模糊處理時)

greedy量詞被看作“貪婪的”,因為它第一次就讀入整個被模糊匹配的字符串。如果第一個匹配嘗試(整個輸入字串)失敗,則匹配器就會在被匹配字串中的最後一位後退一個字元並且再次嘗試,重複這個過程,直到找到匹配或沒有更多剩餘的字符可以後退為止。根據表達式中使用的量詞,它最後試圖匹配的內容是1 個或0個字元。

但是,reluctant量詞採取相反的方式:它們從被匹配字串的開頭開始,然後逐步地一次讀取一個字元搜尋匹配。它們最後試圖匹配的內容是整個輸入字串。

最後,possessive量詞總是讀完整個輸入字串,嘗試一次(而且只有一次)匹配。和greedy量詞不同,possessive從不後退。

11、Logical 運算子

XY X 後面跟著 Y

X|Y X 或 Y

(X) X,作為捕獲組。例如(abc)表示把abc作為一個整體進行捕獲

12、Back 引用

#\n 任何匹配的nth捕獲組

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

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

2 \A

3 (B(C))

4 (C)

在表達式中可以透過\n來對對應的群組進行引用,例如(ab) 34\1就表示ab34ab,(ab)34(cd)\1\2就表示ab34cdabcd。

13、引用
\ Nothing,但引用以下字符

\Q Nothing,但引用所有字符,直到 \E。 QE之間的字串會原封不動的使用(1.1中轉義字元的除外)。例如, ab\\Q{|}\\\\E
可以符合ab{|}\\

#\E Nothing,但結束從\Q開始的引用

14、特殊構造(非捕獲)

(?:X) X,作為非捕獲組

(?idmsux-idmsux) Nothing,但是將匹配標誌由on 轉為off。例如:表達式(?i)abc(?-i)def 這時,(?i) 開啟不區分大小寫開關,abc 符合

idmsux說明如下:

‐i CASE_INSENSITIVE :US-ASCII 字元集不區分大小寫。 (?i)

‐d UNIX_LINES : 開啟UNIX換行符號

‐m MULTILINE :多行模式(?m)

UNIX下換行為\n

WINDOWS下換行為\r\n(?s)

‐u UNICODE_CASE : Unicode 不區分大小寫。 (?u)

‐x COMMENTS :可以在pattern裡面使用註解,忽略pattern裡面的whitespace,以及"#"一直到結尾(#後面為註解)。 (?x)例如(?x)abc#asfsdadsa可以匹配字串abc

(?idmsux-idmsux:X) X,作為給定標誌 on - off 的非捕獲組。與上面的類似,上面的表達式,可以改寫成為:(?i:abc)def,或(?i)abc(?-i:def)

(?=X) X,透過零寬度的正lookahead。零寬度正先行斷言,僅當子表達式 X 在 此位置的右側匹配時才繼續匹配。例如,\w (?=\d) 表示字母後面跟著數字,但不捕獲數字(不回溯)

(?!X) X,通過零寬度的負 lookahead。零寬度負先行斷言。僅當子表達式 X 不在 此位置的右側匹配時才繼續匹配。例如,\w (?!\d) 表示字母後面不跟數字,且不捕獲數字。

(? (? (?>X) X,作為獨立的非捕獲組(不回溯)

(?=X)與(?>X)的區別在於( ?>X)是不回溯的。例如被符合的字串為abcm

當表達式為a(?:b|bc)m是可以匹配的,而當表達式是a(? >b|bc)時是無法匹配的,因為當後者匹配到b時,由於已經匹配,就跳出了非捕獲組,而不再次對組內的字符進行匹配。可以加快速度。

更多java知識請關注java基礎教學欄位。

以上是java正規知識詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:aizhan。如有侵權,請聯絡admin@php.cn刪除