有一個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封裝成一個對象,以這個物件作為模板去匹配一段文字,就更加自然了。作為模板的那個東西就是下面要討論的正規表示式。先不考慮那麼複雜,看例子: 程序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、寫一個特殊的字串-正規表示式如a|f。
2、將正規表示式編譯成一個範本:p
3、用範本p去匹配字串str。
思路清楚了,現在看Java是如何處理的(Java程式設計師直到JDK1.4才能使用這些類別。
Pattern類別與查找
①public final class java.util.regregex.Pternil.的表達法。告訴你一些設計模式的東西,或是你自己查有關資料。的靜態方法,其回傳值是Pattern物件(的引用)。 p去產生一個字串str的匹配器,它的回傳值是一個Matcher類別的引用,為什麼要這個東西呢?
複製程式碼如下:boolean result=Pattern.compile(regEx).matcher(str).find();句柄柄相與句柄相結合的無實句柄。不是好方式。吧。必要嗎? )輸出正規表示式產生的所有東西。是這種語言,它是一些字串的模式——簡潔而深刻的描述。產生字串的字串-正規表示式,真有些複雜,因為我們希望由普通字元(例如字元a 到z)以及特殊字元(稱為元字元)描述任意的字串,而且要準確。 先看幾個正規表示式範例:
程式3:我們總是用這個程式測試正規表示式
public static Pattern compile(String regex) { return new Pattern(regex, 0); }
①"ab*"—能符合a、ab、abb、abbb…。所以,*表示前面字元可以有零次或多次。如果僅考慮查找,直接用"a"也一樣。但想想替換的情況。 問題regEx="abb*"結果如何?
②"ab+"——能匹配ab、abb、abbb……。等價於"abb*"。問題regEx="or+"結果如何?