- public static void main(String[] args) {
- //選擇最小和最大重複次數
- String a="{user=\"administrator\",password=\"root\"}";
- String b="user =\"a\"";//注意=號之間有空格
- String c="user\r\n=\"c\"";//注意有換行符號
- //獲取雙引號之間的內容,分別獲得a,b,c中的所有的用戶的名稱
- String regex="(?s)user.*?=(\".*?\")";
- match(regex,a);//user="administrator"
- match(regex,b);//user ="a"
- match(regex,c);//user
- //="c"
- //上面的非常簡單,注意以下事例
- //選擇最小和最大重複數
- //注意以下幾點,user =這個之間可能有空格
- //我們需要的結果是找出user='xxx'的信息,其餘不要
- String notice="[{user='admin',password='admin'}," +
- "{user='yhc',password='yhc'}]";
- //也許大家會覺得.*?爲什麼需要?號,那麼一下我們看看
- //有?和沒有?的區別
- String regex1="user.*='(.*?)'";//user.*=之間沒有?
- match(regex1, notice);
- //輸出結果(錯誤):user='admin',password='admin'},{user='yhc',password='yhc'
- String regex2="user.*?='(.*?)'";//user.*=之間有?
- match(regex2, notice);
- //輸出結果(正確):
- //user='admin'
- //user='yhc'
- //爲什麼上面就因爲一個?號而有這麼大的區別咧?
- //解釋以上代碼運行機制
- //有了匹配文本中的第一個user之後,引擎就會到達(.*),其中點號(.)可以
- //匹配任意字符,其中包括換行符,星號(*)則把它重複0次或更多次,請注意,
- //這裏的星號(*)是貪心的,因此點星(.*)會匹配直到目標文件結束的所有的
- //內容,注意=====>>>>(.*)會吃了所有的目標文件內容,從第一個匹配
- //user的地方開始;
- //當(.*)把肚子吃飽之後,引擎纔會試圖去匹配在目標文本末尾的=
- //這個表達式,當然,一定會匹配失敗,但這並不會代表此次匹配就結束了,
- //正則引擎會進行回溯backtrack,當匹配某一個位置之後
- //,正則表達式都會保存一個回溯位置,如果正則表達式匹配之後的文本失敗後
- //那麼正則引擎還可以回到這些位置
- //當=匹配匹配失敗之後,引擎進行回溯,讓(.*)放棄它的匹配中的一個
- //字符接着=會被再次嘗試匹配,這次在文本中的最後一個字符的位置,
- //如果依然失敗的話,那麼引擎會再一次進行回溯在文件的倒數第2個字符出嘗試匹配
- //這個過程會一直繼續,直到=匹配成功位置,如果一直沒有匹配成功,那麼最終(.*)
- //會用完所有的回溯位置,然後正則匹配失敗
- //如果在整個回溯的過程中=在某個點匹配成功,那麼就會接着嘗試匹配'如果'匹配
- //失敗,引擎接着進行回溯,這個過程會一直重複,直到='(.*?)'可以被匹配爲止
- //問題就出現在.*上,因爲星號是貪心的,所以你們要注意哦!
- //我們需要使用lazy 懶惰 可以在後面放一個?使其變爲懶惰
- //例如:(*?),(+?),(??) ,{1,100}? 都可以將其變爲懶惰
- }
- public static void match(String regex,String input){
- //創建正則對象
- Pattern pattern=Pattern.compile(regex);
- //匹配對象
- Matcher matcher=pattern.matcher(input);
- //輸出匹配字符串
- while(matcher.find()){
- System.out.println(matcher.group());
- }
- }
如果以上有寫錯誤的地方,請大家指出,thanks!