Java正則表達式實現字符串的動態多替換


  需求場景:

  今天在處理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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM