java: 正则匹配字符串中多个目标子串(贪婪匹配的模拟实现)
2017-11-28 19:53
316 查看
一个奇怪的需求,需要匹配到字符串里面的
假如目标字符串是
也就是说凡是数字和
更新一下,如果仅仅是实现这个需求,完全不需要使用正则的。正则实在是鸡肋!
以下是更新内容(更优雅的实现!):
依然给出示例调用输出:
这里给出一个不太优雅的实现。毕竟
测试方法如下:
输出如下:
regFinal xs23e+xs4exs66etr5w3e87 ==xs23*e+xs4*exs66*etr5w3*e87
regFinal adv34ertf ==adv34*ertf
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
相关文章推荐
- Java实现正则匹配出script标签中字符串包含某个几个单词的所有行,以及编码转换
- Java查找一个字符串中所有匹配某正则的子串
- java正则匹配实现字符串2014-9-10 22:34 对应加上n秒后的时间
- Java正则之贪婪匹配,惰性匹配
- JAVA 正则表达式:使用group方法计算匹配到的字符串个数
- Java字符串处理与正则匹配的使用
- @V@ java代码笔记2010-06-12:java控制台输入各类型类实现;以及判断输入字符串里面是否有数字的两种方法:方法1:转换成字符数组;方法2:正则表达式。
- Java-过滤字符串(用模式匹配实现)
- Java实现字符串的匹配
- js正则实现从一段复杂html代码字符串中匹配并处理特定信息
- Java:正则匹配的不同情况(贪婪,勉强): greedy, reluctant, possesive
- Java正则表达式实现字符串的动态多替换
- Java 用正则表达式来实现 通配符匹配 (支持*, ?)
- Java正则之贪婪匹配,惰性匹配
- java正则表达式不写^和$,表示匹配目标串的部分(包括本身)
- 使用正则匹配字符串的子串
- REGEXP 正则的实现两个字符串组的匹配。
- java中正则表达式提取字符串中日期实现代码
- 字符串处理是许多程序中非常重要的一部分,它们可以用于文本显示,数据表示,查找键和很多目的.在Unix下,用户可以使用正则表达式的强健功能实现这些 目的,从Java1.4起,Java核心API就引入了java.util.regex程序包,它是一种有价值的基础
- java实现字符串的匹配