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

一个奇怪的需求,需要匹配到字符串里面的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*e
xs23e+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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值