2007年7月10日 星期二

Regular Expression 在 replace 的應用

Regular Expression, 有人翻做「通用運算式」, 也有人翻做「正則表達式」, 不管要怎麼翻, 主要作用就是在字串中用一些特定的符號來代表一些特定的用途
有興趣者可參閱
http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Pattern.html

以下我將介紹其中一種應用


若有一個字串 "123abc456AbC789" 希望將 "abc" 不分大小寫的在其兩旁加上"-",
並且結果要維持它原本的大小寫, 也就是要得到 "123-abc-456-AbC-789"

若用

1
2
String s = "123abc456AbC789";
String s2 = s.replaceAll("abc","-abc-");


只能得到 "123-abc-456AbC789", 並不是想要的

再改用

1
2
3
String s = "123abc456AbC789";
String s2 = Pattern.compile("abc",Pattern.CASE_INSENSITIVE)
.matcher(s).replaceAll("-abc-");


雖能不分大小寫取代, 但也只能得到 "123-abc-456-abc-789", 後面的 "AbC" 也被轉成小寫了
所以還是一樣不對

後來才發現可以像這樣用

1
2
3
String s = "123abc456AbC789";
String s2 = Pattern.compile("(abc)",Pattern.CASE_INSENSITIVE)
.matcher(s).replaceAll("-$1-");


終於得到想要的字串了

原來在 regular expression 中用括號括起來的部份視為一個群組,
而在 replacement 中可用 $ 加數字來帶入該群組對應的實際值,
所以最後才會有 "-$1-" , ( $1 代表第一個群組 )


更簡單的寫法其實用 String.replaceAll() 就可以做到

1
2
String s = "123abc456AbC789";
String s2 = s.replaceAll("(?i)(abc)","-$1-");


(?i)代表不分大小寫, 其他的就跟前述一樣囉

--關鍵字--
{Regular Expression} {通用運算式}{正則表達式}{正則運算式}

1 則留言:

廣告訊息會被我刪除