模式匹配-正則表達式


模式匹配-正則表達式

 主要內容:匹配內容,匹配模式,實現

Java1.4,Java核心API就引入了java.util.regex程序包,它包括兩個類:PatternMatcher. 
Pattern
是對正則表達式進行編譯,得到正則表達式的表現模式。

Matcher利用Pattern得到的表現模式進行模式匹配。

Pattern類的方法簡述 

方法 說明
static Pettern compile(String regex,int flag) 編譯模式,參數regex表示輸入的正則表達式,flag表示模式類型(Pattern.CASE_INSENSITIVE 表示不區分大小寫)
Matcher matcher(CharSequence input) 獲取匹配器,input時輸入的待處理的字符串
static boolean matches(String regex, CharSequence input) 快速的匹配調用,直接根據輸入的模式regex匹配input
String[] split(CharSequence input,int limit) 分隔字符串input,limit參數可以限制分隔的次數


Matcher類的方法簡述

方法 說明
boolean find() 查找模式匹配
String group() 獲得匹配
String group(int number) 獲得第number個的匹配

 

 

 

可在Pattern類中查看所有通配符含義

符號

含義

實例

子模式0次或1

 

*

子模式0次或多次

 

+

子模式1次或多次

 

{n}

n個字符

[abcd]{3}

{n,}

至少n個字符

[abcd]{3,}

{n,m}

nm個字符

[abcd]{3,5}

.

任何單個字符

 

-

連字符

a-z

\s

空白(空格符,換行符,回車符等)

 

\S

非空白

 

\d

數字字符

 

\D

非數字字符

 

\w

單詞字符

[0-9A-Za-z]

\W

非單詞字符

 

\

轉義符

\* 匹配*

^上尖括號符

[^]表示非,^表示起始符

[^abd]^[0-9]+[a-z]*

$

表示結束符

^[0-9]\-[a-z]+$

[]

字符列表中的任意一個

[abc]匹配abc中任意一個

()

子表達式

(abc)匹配abc

|

或,與()進行組合

(ab|cd|ef)

dws

x 字符x
\ 反斜線字符
n 帶有八進制值0的字符n(0 <= n <= 7)
nn 帶有八進制值0的字符nn(0 <= n <= 7)
mnn 帶有八進制值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 空白字符:[ tnx0Bfr]
S 非空白字符:[^s]
w 單詞字符:[a-zA-Z_0-9]
W 非單詞字符:[^w]
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-x1Fx7F]
p{XDigit} 十六進制數字:[0-9a-fA-F]
p{Space} 空白字符:[ tnx0Bfr]
p{javaLowerCase} 等效於 java.lang.Character.isLowerCase()
p{javaUpperCase} 等效於 java.lang.Character.isUpperCase()
p{javaWhitespace} 等效於 java.lang.Character.isWhitespace()
p{javaMirrored} 等效於 java.lang.Character.isMirrored()
p{InGreek} Greek 塊(簡單)中的字符
p{Lu} 大寫字母(簡單類別
p{Sc} 貨幣符號
P{InGreek} 所有字符,Greek 塊中的除外(否定)
[p{L}&&[^p{Lu}]]  所有字母,大寫字母除外(減去)
^ 行的開頭
$ 行的結尾
b 單詞邊界
B 非單詞邊界
A 輸入的開頭
G 上一個匹配的結尾
Z 輸入的結尾,僅用於最后的結束符(如果有的話)
z 輸入的結尾
X? X,一次或一次也沒有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好n次
X{n,} X,至少n次
X{n,m} X,至少n次,但是不超過m次
X?? X,一次或一次也沒有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好n次
X{n,}? X,至少n次
X{n,m}? X,至少n次,但是不超過m次
X?+ X,一次或一次也沒有
X*+ X,零次或多次
X++ X,一次或多次
X{n}+ X,恰好n次
X{n,}+ X,至少n次
X{n,m}+ X,至少n次,但是不超過m次
XY X后跟Y
X|Y X或Y
(X) X,作為捕獲組
n 任何匹配的nth捕獲組
  Nothing,但是引用以下字符
Q Nothing,但是引用所有字符,直到E
E Nothing,但是結束從Q開始的引用
(?:X) X,作為非捕獲組
(?idmsux-idmsux)  Nothing,但是將匹配標志idmsux on - off
(?idmsux-idmsux:X)   X,作為帶有給定標志idmsux on - off
(?=X) X,通過零寬度的正 lookahead
(?!X) X,通過零寬度的負 lookahead
(?<=X) X,通過零寬度的正 lookbehind
(?<!X) X,通過零寬度的負 lookbehind
(?>X) X,作為獨立的非捕獲組
 
一、
      //只判斷
     String[] dataArr = { "moon", "mon", "moon", "mono" }; 
for (String str : dataArr) { 
String patternStr="m(o+)n"; 
boolean result = Pattern.matches(patternStr, str); 
if (result) {
    System.out.println("字符串"+str+"匹配模式"+patternStr+"成功"); 
else{ 
    System.out.println("字符串"+str+"匹配模式"+patternStr+"失敗"); 
     //找到匹配內容   
     String regex ="([A-Za-z])12"; 
     Pattern pattern = Pattern.compile(regex);
     Matcher matcher = pattern.matcher("d123456");
     Boolean result = matcher.find();
     while(result) 
                    {
                        system.out.println(matcher.group()+":"+matcher.group(1));
                        result = matcher.find();
                    }
 
//匹配替換
Pattern p = Pattern.compile("m(o+)n",Pattern.CASE_INSENSITIVE); 
// 用Pattern類的matcher()方法生成一個Matcher對象 
Matcher m = p.matcher("moon mooon Mon mooooon Mooon"); 
StringBuffer sb = new StringBuffer(); 
// 使用find()方法查找第一個匹配的對象 
boolean result = m.find(); 
// 使用循環找出模式匹配的內容替換之,再將內容加到sb里 
while (result) { 
m.appendReplacement(sb, "moon"); 
result = m.find(); 

// 最后調用appendTail()方法將最后一次匹配后的剩余字符串加到sb里; 
m.appendTail(sb); 
System.out.println("替換后內容是" + sb.toString()); 

//正則表達式切割
String input="職務=GM 薪水=50000 , 姓名=職業經理人 ; 性別=男 年齡=45 "; 
String patternStr="(\s*,\s*)|(\s*;\s*)|(\s+)"; 
Pattern pattern=Pattern.compile(patternStr); 
String[] dataArr=pattern.split(input); 
for (String str : dataArr) { 
    System.out.println(str); 
//注意這里要把復雜的模式寫在前面,否則簡單模式會先匹配上. 
String input="職務=GM 薪水=50000 , 姓名=職業經理人 ; 性別=男 年齡=45 "; 
String patternStr="(\s*,\s*)|(\s*;\s*)|(\s+)"; 
Pattern pattern=Pattern.compile(patternStr); 
String[] dataArr=pattern.split(input); 
for (String str : dataArr) { 
System.out.println(str); 

 

 
 
二、 Pattern標記
 Pattern類的靜態方法
static Pattern compile(String regex, int flags)
          將給定的正則表達式編譯到具有給定標志的模式中。
其中的flags參數就是Pattern標記,這個標記在某些時候非常重要。
 Pattern.CANON_EQ
          啟用規范等價。
Pattern.CASE_INSENSITIVE
          啟用不區分大小寫的匹配。
Pattern.COMMENTS
          模式中允許空白和注釋。
Pattern.DOTALL
          啟用 dotall 模式。
Pattern.LITERAL
          啟用模式的字面值分析。
Pattern.MULTILINE
          啟用多行模式。
Pattern.UNICODE_CASE
          啟用 Unicode 感知的大小寫折疊。
Pattern.UNIX_LINES
          啟用 Unix 行模式。
 
 
 三、 字符串的替換
String.replace(char oldChar, char newChar)
          返回一個新的字符串,它是通過用 newChar 替換此字符串中出現的所有 oldChar 而生成的。
String.replace(CharSequence target, CharSequence replacement)
          使用指定的字面值替換序列替換此字符串匹配字面值目標序列的每個子字符串。
String.replaceAll(String regex, String replacement)
          使用給定的 replacement 字符串替換此字符串匹配給定的正則表達式的每個子字符串。
String.replaceFirst(String regex, String replacement)
          使用給定的 replacement 字符串替換此字符串匹配給定的正則表達式的第一個子字符串。
 StringBuffer.replace(int start, int end, String str)
          使用給定 String 中的字符替換此序列的子字符串中的字符。
StringBuilder.replace(int, int, java.lang.String)
          使用給定 String 中的字符替換此序列的子字符串中的字符。
 Matcher.replaceAll(String replacement)
          替換模式與給定替換字符串相匹配的輸入序列的每個子序列。
Matcher.replaceFirst(String replacement)
          替換模式與給定替換字符串匹配的輸入序列的第一個子序列。 
四、字符串的切分
String[] split(String regex)
          根據給定的正則表達式的匹配來拆分此字符串。
 String[] split(String regex, int limit)
          根據匹配給定的正則表達式來拆分此字符串。
 
 
五、正則表達式實例
{ "moon", "mon", "moon", "mono" }
"m(o+)n"
 
{ "ban", "ben", "bin", "bon" ,"bun","byn","baen"}
b[aeiou]n
 
{ "1", "10", "101", "1010" ,"100+"}
"\d+"
 
String str="薪水,職位 姓名;年齡 性別"; 
String[] dataArr =str.split("[,\s;]");
 
String str="2007年12月11日"; 
Pattern p = Pattern.compile("[年月日]"); 
String[] dataArr =p.split(str); 
 
六、注意點
 1:String rex="\\[Pop3Server-15\\] \\[.*oip=(.*)\\]";  
在正則表達式中[]屬於特殊字符
 
 
七、正則表達式應用
1:模式匹配最大匹配原則
2:找到字符串中所有滿足要求的內容
        String regEx = "<a>(\\w+)</a>";
        String s = "<a>123</a><a>456</a><a>789</a>";
        Pattern pat = Pattern.compile(regEx);
        Matcher mat = pat.matcher(s);
        while(mat.find()){
            System.out.println(mat.group(0));
        }
<a>123</a>
<a>456</a>
<a>789</a>  
 
 
 
 
 
 
 
 
 
                 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM