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
阅读全文
0 0
- java: 正则匹配字符串中多个目标子串(贪婪匹配的模拟实现)
- java 正则贪婪匹配
- 使用正则匹配字符串的子串
- Java正则之贪婪匹配,惰性匹配
- Java正则之贪婪匹配,惰性匹配
- Java正则之贪婪匹配、惰性匹配
- 正则表达式的贪婪匹配(.*)和非贪婪匹配(.*?)
- 正则表达式的贪婪匹配和费贪婪匹配
- 正则表达式的贪婪匹配和非贪婪匹配
- 正则表达式的贪婪匹配和非贪婪匹配
- python 正则表达式的贪婪匹配与非贪婪匹配
- js正则表达式的贪婪匹配和非贪婪匹配
- 正则-贪婪匹配(最大匹配) 和最小匹配的问题。
- 正则表达式查找匹配的子字符串
- [Python]解决正则表达式的"贪婪"匹配
- VIM中正则的非贪婪匹配
- VIM中正则的非贪婪匹配
- java中正则匹配的贪婪模式和非贪婪模式
- 将指定的form表单中所有的输入项转为json数据{key:value,key:value}
- VS调试时断点无法进入或命中的原因及解决方法(PDB引发的)
- 大O符号
- hdu3333Turing Tree
- 在用vtk8.0.0进行编程时,发现拾取actor时总是不对
- java: 正则匹配字符串中多个目标子串(贪婪匹配的模拟实现)
- 菲波那切数列
- Hdu 1181 -- 简单深搜的剪枝以及vector小结
- 顶会文章链接
- JAVA基础之思维导图
- Linux system DNS
- 为类取别名
- 无线携能通信网络在多用户接收用户时的波束成形优化代码
- Python爬虫学习纪要(十):Requests 库学习笔记5