java语言:正则匹配字符串实现多个目标子串
Vivian 2018-06-14 来源 : 阅读 1158 评论 0

摘要:本文主要向大家介绍了java语言的正则匹配字符串实现多个目标子串,通过具体的代码向大家展示,希望对大家学习java语言有所帮助。

本文主要向大家介绍了java语言的正则匹配字符串实现多个目标子串,通过具体的代码向大家展示,希望对大家学习java语言有所帮助。

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

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

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

<code><code><code><code><code><code>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();
    }</code></code></code></code></code></code>

   

依然给出示例调用输出:

<code><code><code><code><code><code>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</code></code></code></code></code></code>

   

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

<code><code><code><code><code><code><code>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};
    }</code></code></code></code></code></code></code>

   

测试方法如下:

<code><code><code><code><code><code><code>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"));
 
    }</code></code></code></code></code></code></code>

   

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

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @Vivian 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程