java 經常使用正則表達式 的使用

這裏只分享一些我經常使用的正則式技巧,都是結合個人實際使用爲例html

經常使用的正則式

  • 匹配url:https?://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|] 有些特例也會被匹配到,好比 http://.com,畢竟url不容易驗證
  • 匹配漢字:[\u4e00-\u9fa5] 有時候要求輸入數字英文和漢字,能夠這麼寫:[\d|\w|\u4e00-\u9fa5]+?
  • 匹配數字:\p{Digit}+ , [0-9]+ , \d+
  • 匹配標籤:<html>(.*?)</html> 默認.並不匹配換行符,須要使用<xxx>([\s\S]*?)</xxx>來匹配

須要escape的特殊字符

$()*+.[]?\^{}|git

字符串escape[好比匹配指定前綴]

有的時候咱們要匹配指定前綴,不免會有一些特殊字符,好比: $(xxx)-01 , $(xxx)-02 , $(xxx)-03 這裏涉及到escape的字符,須要替換,不然會當作正則式的特殊符號處理 正常都是replaceAll解決,其實有更簡單的辦法 咱們能夠經過 ** Pattern.quote ** 解決 String regex=Pattern.quote("$(xxx)-") + "\\d+";數組

單詞邊界[適用於在編輯器中搜索變量]

\b表示完整單詞 \B表示單詞內局部內容 好比在編輯器裏搜索,一般編輯器裏都支持正則式的搜索,搜索變量 abc 能夠搜索 \babc\b 這是我經常使用的方法mybatis

匹配後綴文件名[好比abc.xls和def.xls都要匹配到]

對於文件後綴,咱們能夠忽略大小寫,這裏咱們要用到一個技巧: (?i)不會區分大小寫,若是表示一段區間,能夠用(?-i)結束 好比上面的例子,咱們能夠這麼寫 "^.+\\.(?i)(xls)(?-i)$" 能夠直接用字符串的match方法匹配 "abcdef.XLS".matches("^.+\\.(?i)(xls)(?-i)$");app

正則式的匹配方式

類型 說明
CANON_EQ 啓用規範等價。
CASE_INSENSITIVE 啓用不區分大小寫的匹配。
COMMENTS 模式中容許空白和註釋。
DOTALL 啓用 dotall 模式。
LITERAL 啓用模式的字面值解析。
MULTILINE 啓用多行模式。
UNICODE_CASE 啓用 Unicode 感知的大小寫摺疊。
UNIX_LINES 啓用 Unix 行模式。

這裏我比較經常使用的就是CASE_INSENSITIVEUNICODE_CASE,MULTILINE偶爾也會用得上dom

其餘的一些技巧

替換標籤[好比自定義佔位符]

有的時候咱們可能須要大量重複但格式近似的文件,好比ibatis或mybatis的domain,mapper這些文件,每一個人的風格不一樣,複製粘貼須要修改不少地方,且易出錯 咱們能夠把須要修改的地方用本身定義的佔位符替換掉,這裏簡單說思路,可能有不完善處:編輯器

  1. 利用正則式match括號中的內容,存爲數組,簡單的代碼以下:
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        Matcher m = p.matcher(input);
        while (m.find()) {
            String temp2=m.group(1);
            temp.add(temp2);
        }
  1. 替換標籤爲%s res=res.replaceAll("<demo>([\\s\\S]*?)</demo>","%s");
  2. 處理數組的內容,並把結果貼上去 res=String.format(res,list.toArray());
相關文章
相關標籤/搜索