java: 正则匹配字符串中多个目标子串(贪婪匹配的模拟实现)

来源:互联网 发布:mac mini重装系统教程 编辑:程序博客网 时间:2024/05/23 01:04

一个奇怪的需求,需要匹配到字符串里面的123e这样子的东西,并替换成123*e。比如3e / 21e这样子。

假如目标字符串是123efg45emkd89eqq,则替换之后的字符串应该是123*efg45*emkd89*eqq
也就是说凡是数字和e的组合全部替换成数字和*e

更新一下,如果仅仅是实现这个需求,完全不需要使用正则的。正则实在是鸡肋!
以下是更新内容(更优雅的实现!)

public static String replaceE(String src) {        if (src == null) return null;        StringBuilder sb = new StringBuilder();        while (true) {            int e = src.indexOf("e");            if (e > 0) {                if (src.charAt(e - 1) >= '0' && src.charAt(e - 1) <= '9') {                    //  need replace                    sb.append(src.substring(0, e)).append("*").append('e');                    src = e + 1 < src.length() ? src.substring(e + 1) : "";                } else {                    sb.append(src.substring(0, e)).append("*").append('e');                    src = e + 1 < src.length() ? src.substring(e + 1) : "";                }            } else {                break;            }        }        return sb.toString();    }
  • 依然给出示例调用输出:
System.out.println("adv34ertf --> "+replaceE("adv34ertf"));System.out.println("xs23e+xs4exs66etr5w3e87 --> "+replaceE("xs23e+xs4exs66etr5w3e87"));//  输出:adv34ertf --> adv34*exs23e+xs4exs66etr5w3e87 --> xs23*e+xs4*exs66*etr5w3*e

这里给出一个不太优雅的实现。毕竟Java的正则api不是很明朗,很多方法毫无卵用。搜关键字贪婪匹配毫无卵用!!!

public static String regFinal(String src) {        String target;        while (true) {            Object[] obj = regExNumberEOrigin(src);            target = (String) obj[1];//            System.out.println("src= " + src + " , target= " + target);            if (target.equals(src) || !(boolean) obj[0]) {                break;            }            src = target;        }        return target;    }    private static Object[] regExNumberEOrigin(String src) {        String regEx = "\\d+e";        Pattern p = Pattern.compile(regEx);        Matcher m = p.matcher(src);        boolean find = m.find();        if (find) {            String found = m.group();            String number = found.substring(0, found.length() - 1);            int start = src.indexOf(found);            int end = start + found.length();            String target = number.concat("*").concat("e");            String ret = src.substring(0, start).concat(target).concat(src.substring(end));            return new Object[]{true, ret};        }        return new Object[]{false, src};    }

测试方法如下:

public static void main(String[] args) {//        System.out.println("regFinal xs23e+xs4exs66etr5w3e87 ==" + regExNumberEOrigin("xs23e+xs4exs66etr5w3e87"));        System.out.println("regFinal xs23e+xs4exs66etr5w3e87 ==" + regFinal("xs23e+xs4exs66etr5w3e87"));        System.out.println("regFinal adv34ertf ==" + regFinal("adv34ertf"));    }

输出如下:
regFinal xs23e+xs4exs66etr5w3e87 ==xs23*e+xs4*exs66*etr5w3*e87
regFinal adv34ertf ==adv34*ertf

原创粉丝点击