需求場景:
今天在處理SQL語句的時候,由於數據庫中存的格式是VARCHAR2型的,這就需要對SQL語句中WHERE條件后邊的帶數字的字符串加上單引號,對於字符串的處理,首先想到的就是正則表達式,對正則表達式,雖然有一些了解,但是也談上很熟練,百度了一番(正常網絡也就那個幾個無奈的搜索引擎使用啦),發現替換,基本上屬於固定替換,就是把某一類符合正則標准的,全部替換為一個固定的字符串,比如說,錯別字的處理啊,還是比較好用的,這個在程序中也有實現,很easy。但是,我需要的是多個,且是動態替換的,最基本的就是保留原來的匹配出來的串,然后再在首尾加上些東西。我大致搜索了一下,沒發現一個滿足我要求的。好吧,那就自己動手,豐衣足食吧。
解決方案:
簡單說說我的思路,我是將字符串,進行了兩次分割,一次匹配出滿足正則表達式的串,一次匹配出不滿足正則的串,這樣他們總是相間的出現的,這樣我就可以隨意的操作匹配或者非匹配的串,然后再把他們何到一起。
上源碼:
1 package com.util.regex; 2 3 import java.util.Iterator; 4 import java.util.LinkedHashMap; 5 import java.util.Map; 6 import java.util.regex.Matcher; 7 import java.util.regex.Pattern; 8 9 public class RegexUtil { 10 private String strSource=""; 11 private String StrRe=""; 12 13 public String getStrSource() { 14 return strSource; 15 } 16 public void setStrSource(String strSource) { 17 this.strSource = strSource; 18 } 19 public String getStrRe() { 20 return StrRe; 21 } 22 public void setStrRe(String strRe) { 23 StrRe = strRe; 24 } 25 public String flixedReplace(String rep){ 26 return this.strSource.replaceAll(this.StrRe, rep); 27 } 28 /** 29 * <li>Description:</li> 30 * <li>Date:</li> 31 * <li>Modify:</li> 32 * <li>Version: 1.0</li> 33 * @author Administrator 34 * @param form 35 * @param last 36 * @return String 37 */ 38 @SuppressWarnings("unchecked") 39 public String splitReplace(String form,String last){ 40 String ss[]=this.getStrSource().split(this.getStrRe()); 41 Pattern p = Pattern.compile(this.getStrRe()); 42 Matcher m = p.matcher(this.getStrSource()); 43 LinkedHashMap<Integer, String> map=new LinkedHashMap<Integer,String>(); 44 int i=0; 45 while(m.find()){ 46 map.put(i, form+m.group()+last); 47 i++; 48 } 49 Iterator<?> iter=map.entrySet().iterator(); 50 StringBuffer tarStr=new StringBuffer(); 51 for(int j=0;j<ss.length;j++){ 52 if(!this.getStrSource().isEmpty()&&(!Character.isDigit(this.getStrSource().charAt(0))||j!=0)){ 53 tarStr.append(ss[j]); 54 } 55 if(iter.hasNext()){ 56 Map.Entry<Integer, String> entry=(Map.Entry<Integer, String>)iter.next(); 57 if(entry.getKey()==j){ 58 tarStr.append(entry.getValue()); 59 } 60 } 61 } 62 return tarStr.toString(); 63 } 64 65 public static void main(String[] args) { 66 RegexUtil re=new RegexUtil(); 67 re.setStrSource(" 2132 3213 adsd 12321 asdfsa dsdf 12 1313adfaf231321dfafda1141dfaffafdf"); 68 re.setStrRe("\\d+"); 69 System.out.println(re.flixedReplace("hello")); 70 System.out.println(re.splitReplace("'", "'")); 71 // System.out.println(re.getStrSource().replaceAll("(\\w+)(\\d+)", "$1'$2")); 72 } 73 }
