java正则表达式对象_Java正则表达式之Pattern类
java.util.regex.Pattern類指正則表達式的編譯表示形式。即將你的正則表達式字符串編譯成java正則表達式對象。所有的正則表達式字符串在使用前都必須先編譯成Pattern類的實例。然后通過這個Pattern對象創建一個Matcher對象,根據你定義的正則表達式,該對象可以與任意字符序列匹配。執行匹配所涉及的所有狀態都駐留在匹配器中,所以多個匹配器可以共享同一模式。 因此,典型的調用順序如下://?第一步:將你自定義的正則表達式(java.*)編譯成java正則表達式對象
Pattern?pattern?=?Pattern.compile("java.*");
//?第二步:解釋自定義的正則表達式(java.*)對字符串(javascript)進行匹配
Matcher?macther?=?pattern.matcher("javascript");
//?第三步:嘗試將整個字符串(javascript)與模式進行匹配匹配
boolean?isMacher?=?macther.matches();
如果僅使用一次的正則表達式,可以方便地通過Pattern類定義matches方法。此方法編譯表達式并在單個調用中將輸入序列與其匹配。語句如下:boolean?b?=?Pattern.matches("java.*",?"javascript");
該語句等效于上面的三個語句,盡管對于重復的匹配而言它效率不高,因為它不允許重用已編譯的模式。 注意:Pattern類的實例是不可變的,可以在多個并發線程下安全使用。
使用正則表達式之前必須先要了解正則表達式的常用語法,由于正則表達式在不同的語言中實現存在一定的差異,下面將列出在Java對正則表達式的定義:
構造 ? ? ?匹配
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.isWhitespace()
\p{javaMirrored} 等效于 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, 作為獨立的非捕獲組
package?com.bug315;
import?java.util.Arrays;
import?java.util.regex.Matcher;
import?java.util.regex.Pattern;
/**
*?java正則表達式中的Pattern類
*?@author?hx
*
*/
public?class?PatternTest01?{
public?static?void?main(String[]?args)?{
//?定義正則表達式(只匹配https://www.***.com類似網址)
String?patternStr?=?"^\\s*http\\:\\/\\/w{3}\\..{2,}\\.com\\s*$";
String?sourceStr1?=?"?https://www.hxstrive.com????";
String?sourceStr2?=?"HTTP://www.bug315.cOm?????";
/**
*?使用默認標志將指定的正則表達式編譯為Pattern對象
*/
Pattern?pattern01?=?Pattern.compile(patternStr);
Matcher?macther01?=?pattern01.matcher(sourceStr1);
Matcher?macther02?=?pattern01.matcher(sourceStr2);
//?true
System.out.println("macther01.matches()="?+?macther01.matches()?);
//?false?(因為HTTP是大寫的)
System.out.println("macther02.matches()="?+?macther02.matches()?);
/**
*?使用指定的標志編譯指定的正則表達式
*?Pattern.CASE_INSENSITIVE?表示啟用不區分大小寫的匹配。更多請參考API
*?Pattern.MULTILINE?表示啟用多行模式
*/
Pattern?pattern12?=?Pattern.compile(patternStr,
Pattern.CASE_INSENSITIVE?+?Pattern.MULTILINE);
Matcher?macther11?=?pattern12.matcher(sourceStr1);
Matcher?macther12?=?pattern12.matcher(sourceStr2);
//?true
System.out.println("macther11.matches()="?+?macther11.matches()?);
//?true
System.out.println("macther12.matches()="?+?macther12.matches()?);
//?返回在compile設置的flag值,這里返回的是10(CASE_INSENSITIVE=2,MULTILINE=8)2+8=10
System.out.println(pattern12.flags());
/**
*?使用pattern的matches方法進行匹配,該方法建議在模式不復用的情況下使用。
*?因為這種方式非常便捷,可以將上面的三個步驟轉換成一個步驟。
*/
boolean?isMacher01?=?Pattern.matches(patternStr,?sourceStr1);
boolean?isMacher02?=?Pattern.matches(patternStr,?sourceStr2);
System.out.println("isMacher01="?+?isMacher01);
System.out.println("isMacher02="?+?isMacher02);
/**
*?使用Pattern的split方法對字符序列進行按照表達式進行分割
*?例:使用|^|對字符串進行分割
*/
Pattern?pattern03?=?Pattern.compile("\\|\\^\\|");
String[]?split01?=?pattern03.split("java|^|c++|^|php");
//?設定使用指定分隔符分割2次
String[]?split02?=?pattern03.split("java|^|c++|^|php",?2);
System.out.println(?Arrays.toString(split01)?);
System.out.println(?Arrays.toString(split02)?);
/**
*?獲取輸入的正則表達式模式
*/
Pattern?pattern04?=?Pattern.compile(patternStr);
System.out.println(pattern04.pattern());
System.out.println(pattern04.toString());
}
}
輸出結果:
macther01.matches()=true
macther02.matches()=false
macther11.matches()=true
macther12.matches()=true
10
isMacher01=true
isMacher02=false
[java, c++, php]
[java, c++|^|php]
^\s*http\:\/\/w{3}\..{2,}\.com\s*$
^\s*http\:\/\/w{3}\..{2,}\.com\s*$
總結
以上是生活随笔為你收集整理的java正则表达式对象_Java正则表达式之Pattern类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中char类型_【考点】JAVA
- 下一篇: linux地柜查找文件_linux-fi