有一個String,如何查詢其中是否有y和f字元?最黑暗的辦法就是:
程式1:我知道if、for語句和charAt()
class Test{ public static void main(String args[]) { String str="For my money, the important thing "+"about the meeting was bridge-building"; char x='y'; char y='f'; boolean result=false; for(int i=0;i<str.length;i++){ char z=str.charAt(i); //System.out.println(z); if(x==z||y==z) { result=true; break; } else result=false; } System.out.println(result); }}
好像很直觀,但這種方式難以應付複雜的工作。如查詢一段文字中,是否有is?是否有thing或ting等。這是一個討厭的工作。
Java的java.util.regex包
按照物件導向的思路,把希望查詢的字串如is、thing或ting封裝成一個對象,以這個對象作為模板去匹配一段文字,就更加自然了。作為模板的那個東西就是下面要討論的Regex。先不考慮那麼複雜,看一個例子: 程式2:不懂。先看看可以吧?
import java.util.regex.*;class Regex1{ public static void main(String args[]) { String str="For my money, the important thing "+"about the meeting was bridge-building"; String regEx="a|f"; //表示a或f Pattern p=Pattern.compile(regEx); Matcher m=p.matcher(str); boolean result=m.find(); System.out.println(result); }}
如果str匹配regEx,那麼result為true,否則為flase。如果想在尋找時忽略大小寫,則可以寫成:
Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);
雖然暫時不知道Pattern(模板、模式)和Matcher(匹配器)的細節,程式的感覺就比較爽,如果先查詢is、後來又要查詢thing或ting,我們只需要修改一下模板Pattern,而不是考慮if語句和for語句,或者通過charAt()。
1、寫一個特殊的字串——Regex如a|f。
2、將Regex編譯成一個模板:p
3、用模板p去匹配字串str。
思路清楚了,現在看Java是如何處理的(Java程式員直到JDK1.4才能使用這些類。
Pattern類與尋找
①public final class java.util.regex.Pattern是Regex編譯後的表達法。下面的語句將建立一個Pattern對象並賦值給控制代碼p:Pattern p=Pattern.compile(regEx);
有趣的是,Pattern類是final類,而且它的構造器是private。也許有人告訴你一些設計模式的東西,或者你自己查有關資料。這裡的結論是:Pattern類不能被繼承,我們不能通過new建立Pattern類的對象。
因此在Pattern類中,提供了2個重載的靜態方法,其傳回值是Pattern對象(的引用)。如:
public static Pattern compile(String regex) { return new Pattern(regex, 0);}
當然,我們可以聲明Pattern類的控制代碼,如Pattern p=null;
②p.matcher(str)表示以用模板p去產生一個字串str的匹配器,它的傳回值是一個Matcher類的引用,為什麼要這個東西呢?按照自然的想法,返回一個boolean值不行嗎?
我們可以簡單的使用如下方法:
複製代碼 代碼如下:
boolean result=Pattern.compile(regEx).matcher(str).find();
其實是三個語句合并的無控制代碼方式。無控制代碼常常不是好方式。後面再學習Matcher類吧。先看看regEx——這個怪咚咚。
Regex之限定符
Regex(Regular Expression)是一種產生字串的字串。暈吧。比如說,String regEx="me+";這裡字串me+能夠產生的字串是:me、mee、meee、meeeeeeeeee等等,一個Regex可能產生無窮的字串,所以我們不可能(有必要嗎?)輸出Regex產生的所有東西。
反過來考慮,對於字串:me、mee、meee、meeeeeeeeee等等,我們能否有一種語言去描述它們呢?顯然,Regex語言是這種語言,它是一些字串的模式——簡潔而深刻的描述。
我們使用Regex,用於字串尋找、匹配、指定字串替換、字串分割等等目的。
產生字串的字串——Regex,真有些複雜,因為我們希望由一般字元(例如字元 a 到 z)以及特殊字元(稱為元字元)描述任意的字串,而且要準確。
先看幾個Regex例子:
程式3:我們總用這個程式測試Regex
import java.util.regex.*;class Regex1{ public static void main(String args[]) { String str="For my money, the important thing "; String regEx="ab*"; boolean result=Pattern.compile(regEx).matcher(str).find(); System.out.println(result); }}//ture
①"ab*"——能匹配a、ab、abb、abbb……。所以,*表示前面字元可以有零次或多次。如果僅僅考慮尋找,直接用"a"也一樣。但想想替換的情況。 問題regEx="abb*"結果如何?
②"ab+"——能匹配ab、abb、abbb……。等價於"abb*"。問題regEx="or+"結果如何?
③"or?"——能匹配o和or。? 表示前面字元可以有零次或一次。
這些限定符*、+、?方便地表示了其前面字元(子串)出現的次數(我們用{}來描述): x*,零次或多次 ≡{0,}
以上就是本文的全部內容,希望可以協助大家體會Regex的強大之處。