Java實現字串匹配(基於正則)_java

來源:互聯網
上載者:User

有一個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的強大之處。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.