一位之前的同事在羣裏面忽然發了個需求,要經過正則表達式來取值。給我發過來一張圖,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格式),裏面對正則表達式的概念說的很是詳細。
若是你對正則表達式比較熟悉的話,那麼恭喜你,本文對你來講沒有任何難度了。
感謝全部曾經一塊兒玩耍的小夥伴,是大家讓我有了成長,讓我一次次的進步,謝謝大家!