[原]Java 正則 多子串 匹配 替換

來源:互聯網
上載者:User

Regex異常強大,一直理解不深,用的也不深,這次項目中嘗試,體會到了它的強大之處。字串尋找,匹配,替換,正則無不能做,特別是靈活的運用子串匹配得到的變數值$1,$2,再進行二次處理能夠達到很巧妙的效果。

Java中使用也比較簡單:

1. 編譯Regex的字面值得到對應的模式Pattern對象;

2. 建立匹配給定輸入與此模式的匹配器Matcher;

3. 通過匹配器對象執行操作,匹配器對象的方法很豐富,方法之間組合使用更加強大。

直接代碼吧
public static void main(String[] args) {//被替換關鍵字的的資料來源Map<String,String> tokens = new HashMap<String,String>();tokens.put("cat", "Garfield");tokens.put("beverage", "coffee");//匹配類似velocity規則的字串String template = "${cat} really needs some ${beverage}.";//產生匹配模式的RegexString patternString = "\\$\\{(" + StringUtils.join(tokens.keySet(), "|") + ")\\}";Pattern pattern = Pattern.compile(patternString);Matcher matcher = pattern.matcher(template);//兩個方法:appendReplacement, appendTailStringBuffer sb = new StringBuffer();while(matcher.find()) {    matcher.appendReplacement(sb, tokens.get(matcher.group(1)));}matcher.appendTail(sb);//out: Garfield really needs some coffee.System.out.println(sb.toString());//對於特殊含義字元"\","$",使用Matcher.quoteReplacement消除特殊意義matcher.reset();//out: cat really needs some beverage.System.out.println(matcher.replaceAll("$1"));//out: $1 really needs some $1.System.out.println(matcher.replaceAll(Matcher.quoteReplacement("$1")));//到得郵箱的首碼名。插一句,其實驗證郵箱的正則多種多樣,根據自己的需求寫對應的正則才是王道String emailPattern = "^([a-z0-9_\\.\\-\\+]+)@([\\da-z\\.\\-]+)\\.([a-z\\.]{2,6})$";pattern = Pattern.compile(emailPattern);matcher = pattern.matcher("test@qq.com");//驗證是否郵箱System.out.println(matcher.find());//得到@符號前的郵箱名  out: testSystem.out.println(matcher.replaceAll("$1"));//獲得匹配值String temp = "<meta-data android:name=\"appid\" android:value=\"joy\"></meta-data>";pattern = Pattern.compile("android:(name|value)=\"(.+?)\"");matcher = pattern.matcher(temp);while(matcher.find()) {//out: appid, joySystem.out.println(matcher.group(2));}}
一些老是忘基礎

[...] 位於括弧之內的任一字元

[^...] 不在括弧之中的任一字元

. 除了分行符號之外的任一字元,等價於[^\n]

\w 任何單字字元, 等價於[a-zA-Z0-9]

\W 任何非單字字元,等價於[^a-zA-Z0-9]

\s 任何空白符,等價於[\ t \ n \ r \ f \ v]

\S 任何非空白符,等價於[^\ t \ n \ r \ f \ v]

\d 任何數字,等價於[0-9]

\D 除了數字之外的任何字元,等價於[^0-9]

[\b] 一個退格直接量(特例)

 

{n, m} 匹配前一項至少n次,但是不能超過m次

{n, } 匹配前一項n次,或者多次

{n} 匹配前一項恰好n次

? 匹配前一項0次或1次,也就是說前一項是可選的. 等價於 {0, 1}

+ 匹配前一項1次或多次,等價於{1,}

* 匹配前一項0次或多次.等價於{0,}

 

| 選擇.匹配的要麼是該符號左邊的子運算式,要麼它右邊的子運算式

(...) 分組.將幾個項目分為一個單元.這個單元可由 *、+、?和|等符號使用,而且還可以記住和這個組匹配的字元以供此後引用使用

\n 和第n個分組所匹配的字元相匹配.分組是括弧中的子運算式(可能是嵌套的).分組號是從左至右計數的左括弧數

 

^ 匹配的是字元的開頭,在多行檢索中,匹配的是一行的開頭

$ 匹配的是字元的結尾,在多行檢索中,匹配的是一行的結尾

\b 匹配的是一個詞語的邊界.簡而言之就是位於字元\w 和 \w之間的位置(注意:[\b]匹配的是退格符)

\B 匹配的是非詞語的邊界的字元

題外話

郵箱驗證,以前驗證郵箱,網上搜個正則裝在自己程式裡面就用,其實這是不對的,不同的公司對郵箱的驗證格式是不一樣的,比方說163和qq郵箱註冊,他們要求的格式都不一樣,所以搜一個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.