概述
你是否使用過查找*.tmp臨時文件?
你是否使用過編輯工具中的查找/替換功能?
其實它們都使用了正則表達式
正則表達式的作用
提供更強大的字符串處理能力
測試字符串內的模式
例如,可以測試輸入字符串,以查看字符串內是否出現電話號碼模式或身份證號碼模式。即數據驗證
替換文本
可以使用正則表達式來識別文檔中的特定文本,完全刪除該文本或者用其他文本替換它。
基於模式匹配從字符串中提取子字符串
可以查找文檔內或輸入域內特定的文本。
在JAVA中使用正則表達式
正則表達式在字符串處理上有著強大的功能,sun在jdk1.4加入了對它的支持
jdk1.4中加入了java.util.regex包提供對正則表達式的支持。而且Java.lang.String類中的replaceAll和split函數也是調用的正則表達式來實現的。
正則表達式對字符串的操作主要包括:
1.字符串匹配
2.指定字符串替換
3.指定字符串查找
4.字符串分割
Pattern類
Pattern類的實例表示以字符串形式指定的正則表達式,其語法類似於Perl所用的語法。
用字符串形式指定的正則表達式,必須先編譯成Pattern類的實例。生成的模式用於創建Matcher對象,它根據正則表達式與任意字符序列進行匹配。多個匹配器可以共享一個模式,因為它是非專屬的
用compile方法把給定的正則表達式編譯成模式,然後用matcher方法創建一個匹配器,這個匹配器將根據此模式對給定輸入進行匹配。pattern方法可返回編譯這個模式所用的正則表達式。
Matcher類
通過調用某個模式的matcher方法,從這個模式生成匹配器。匹配器創建之後,就可以用它來執行三類不同的匹配操作:
matches方法根據此模式,對整個輸入序列進行匹配
lookingAt方法根據此模式,從開始處對輸入序列進行匹配。
find方法掃描輸入序列,尋找下一個與模式匹配的地方
這些方法都會返回一個表示成功或失敗的布爾值。如果匹配成功,通過查詢匹配器的狀態,可以獲得更多的信息
構建正則表達式
\d 等於 [0-9] 數字
\D 等於 [^0-9] 非數字
\s 等於 [ \t\n\x0B\f\r] 空白字符
\S 等於 [^ \t\n\x0B\f\r] 非空白字符
\w 等於 [a-zA-Z_0-9] 數字或是英文字
\W 等於 [^a-zA-Z_0-9] 非數字與英文字
$表示每行的結尾
.匹配所有字符,包括空格、Tab字符甚至換行符
|或
[]方括號只允許匹配單個字符
^符號稱為“否”符號。如果用在方括號內,表示不想要匹配的字符。表示每行的開頭
()形成一組
查詢
importjava.util.regex.*;
publicclassRegexExample
{
publicstaticvoidmain(String[]args)
{
Stringstr="aaabcefgABC";
StringregEx="aaa|fff";
Patternp=Pattern.compile(regEx);//編譯成模式
Matcherm=p.matcher(str);//創建一個匹配器
booleanrs=m.find();
if(rs)
{
System.out.println("include!!!");
}
else
{
System.out.println("noinclude!!!");
}
}
}
如果str中有regEx,那麼rs為true,否則為flase。如果想在查找時忽略大小寫,則可以寫成Patternp=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);
提取
(從本例給出所給完整路徑中提取文件名)im()p(ortjava.util.rege
public class RegexExample2
{
public static void main(String[] args)
{
String regEx=".+\\\\(.+)$";
String str="c:\\dir1\\dir2\\name.txt";
Pattern p=Pattern.compile(regEx);
Matcher m=p.matcher(str);
boolean rs=m.find();
for(int i=1;i<=m.groupCount();i++)
{
System.out.println(m.group(i));
}
}
}
以上的執行結果為name.txt,提取的字符串儲存在m.group(i)中,其中i最大值為m.groupCount();
分割
importjava.util.regex.*;
publicclassRegexExample3
{
publicstaticvoidmain(String[]args)
{
StringregEx="::";
Patternp=Pattern.compile(regEx);
String[]r=p.split("xd::abc::cde");
for(inti=0;i<r.length;i++)
{
System.out.println(r[i]);
}
}
}
執行後,r就是{“xd”,“abc”,“cde”},其實分割時還有跟簡單的方法:
Stringstr="xd::abc::cde";
String[]r=str.split("::");
替換(刪除)
importjava.util.regex.*;
publicclassRegexExample1
{
publicstaticvoidmain(String[]args)
{
StringregEx="a+";//表示一個或多個a
Patternp=Pattern.compile(regEx);
Matcherm=p.matcher("aaabbcedaccdeaa");
Strings=m.replaceAll("A");
System.out.println(s);
}
}
結果為"AbbcedAccdeA"
如果寫成空串,既可達到刪除的功能,比如:
Strings=m.replaceAll("");
結果為"bbced ccde"