Java正則表達式字符串匹配示例

一位之前的同事在羣裏面忽然發了個需求,要經過正則表達式來取值。給我發過來一張圖,javascript

從圖中能夠出,需求是,經過下面的正則表達式,取出紅色框所標示的內容java

開始理解錯誤,我覺得是要取出中間的那些內容,不包括"[標題BEGIN]"和「[標題END]」,因而寫了下面的代碼:正則表達式

private static void getStr(){
		String str="[標題BEGIN]<#list>[@cms_chanel id=70]<li class=\"current\"></li>[/@cms_chanel]</#list>[標題END]";
		 Pattern p =Pattern.compile("\\[標題BEGIN\\](.*)\\[標題END\\]");
		 Matcher m =p.matcher(str);
		 
		 
		ArrayList<String> matches= new ArrayList<String>();
		while(m.find())
		{
			matches.add(m.group(1));
		}
		
		for(String s: matches)
		{
			System.out.println("匹配結果:"+s);
		} 
	}

回過頭來一看需求,發現不對,因而再修改,主要是針對pattern進行修改code

過程以下(按順序);ip

1.  Pattern p =Pattern.compile("(\\[標題BEGIN\\](.*)\\[標題END\\])*");文檔

     輸出結果:字符串

      匹配結果:[標題BEGIN]<#list>[@cms_chanel id=70]<li class="current"></li>  [/@cms_chanel]</#list>[標題END]
匹配結果:nullget

      第一個內容是咱們想要的結果,可是產生了兩個結果,並且第二個是null,顯然是不對的。class

      當時猜測是(.*)匹配不到。因而有了下面的修改基礎

2. Pattern p =Pattern.compile("(\\[標題BEGIN\\].*\\[標題END\\])*");

     輸出結果:

     匹配結果:[標題BEGIN]<#list>[@cms_chanel id=70]<li class="current"></li>[/@cms_chanel]</#list>[標題END]
匹配結果:null

      此次注意到,最後面那個*無法匹配,null是這個*匹配出來的。因而修改以下

3. Pattern p =Pattern.compile("(\\[標題BEGIN\\].*\\[標題END\\])");

    輸出結果:

匹配結果:[標題BEGIN]<#list>[@cms_chanel id=70]<li class="current"></li>[/@cms_chanel]</#list>[標題END]
 這就對了,是咱們所須要的結果。

  也能夠換成

  Pattern p =Pattern.compile("(\\[標題BEGIN\\](.*)\\[標題END\\])");

  效果是同樣的。

 後來還發現一個問題,這樣的話,若是包含回車換行的話(\n\r等),無法匹配到,因而查了點資料。

這個問題有兩個解決辦法:

1.設置pattern的模式爲DOTALL

2.使用正則表達式對字符串進行所有替換,表達式爲: String reg = "(?s)'.*'";

 這裏咱們改寫一下代碼

 Pattern p =Pattern.compile("(\\[標題BEGIN\\](.*)\\[標題END\\])",Pattern.DOTALL);

回車換行也能匹配了。

解決了一個問題,學到了java的正則表達式使用方法,這可能只是java關於正則的冰山一角,也許還有其餘更好用得方法,若是從此有發現,再補充進來。

也許你對正則表達式還不是那麼熟悉,那麼我建議你先學好一些基礎再來看本文。推薦看一看微軟javascript的說明文檔(chm格式),裏面對正則表達式的概念說的很是詳細。

若是你對正則表達式比較熟悉的話,那麼恭喜你,本文對你來講沒有任何難度了。 

感謝全部曾經一塊兒玩耍的小夥伴,是大家讓我有了成長,讓我一次次的進步,謝謝大家!

相關文章
相關標籤/搜索