zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    浅入浅出数据结构(17)——有关排序算法的分析
    浅入浅出数据结构(16)——插入排序
    浅入浅出数据结构(15)——优先队列(堆)
    浅入浅出数据结构(14)——散列表
    浅入浅出数据结构(13)——平衡二叉查找树之AVL树
    浅入浅出数据结构(12)——从二分查找到二叉树
    老项目的#iPhone6与iPhone6Plus适配#Icon适配
    老项目的#iPhone6与iPhone6Plus适配#iOS8无法开启定位问题和#解决方案#
    老项目的#iPhone6于iPhone6Plus适配#iPhone6分辨率与适配
    iOS设备屏幕像素总览
  • 原文地址:https://www.cnblogs.com/accipiter/p/3896069.html
Copyright © 2011-2022 走看看