您的位置:首页 > 编程语言 > Java开发

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

2017-11-28 19:53 316 查看
一个奇怪的需求,需要匹配到字符串里面的
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐