/**

* 替换上下文

*

* @author tianhongjun

*

*/

static class EvaluateContext {

private int startPos;

private int endPos;

private String replacement;

}

public interface IEvaluator {

String evaluate(String[] groups);

}

/**

* 正则替换

*

* @param src 原始字符串

* @param regex 替换正则

* @param replacer 替换器(根据匹配的内容不同返回不同的替换值,类似模板替换)

* @return

*/

public static String replace(final String src, final Pattern regex, IEvaluator replacer) {

final Matcher m = regex.matcher(src);

// 先查询匹配

List ctxs = new ArrayList<>();

while (m.find()) {

// 记录所有匹配的位置 & 匹配结果

EvaluateContext ctx = new EvaluateContext();

ctx.startPos = m.start();

ctx.endPos = m.end();

//            System.out.println("grp count = " + m.groupCount());

String[] groups = new String[m.groupCount() + 1];

groups[0] = m.group();

for (int i = 0; i < m.groupCount(); i++) {

groups[i + 1] = m.group(i + 1);

}

ctx.replacement = replacer.evaluate(groups);

ctxs.add(ctx);

}

// 再进行替换

List parts = new ArrayList<>();

int sp = 0;

for (EvaluateContext ctx : ctxs) {

if (sp < ctx.startPos) {

parts.add(src.substring(sp, ctx.startPos));

}

parts.add(ctx.replacement);

sp = ctx.endPos;

}

// 结尾补齐

if (sp < src.length()) {

parts.add(src.substring(sp));

}

StringBuilder sb = new StringBuilder();

for (String s : parts) {

sb.append(s);

}

return sb.toString();

}

标签:src,Java,String,sp,ctx,正则,parts,替换

来源: https://www.cnblogs.com/top10/p/11112696.html

java 正则替换 或_Java正则替换相关推荐

  1. java各种符号用法_Java正则的基本用法一:符号

    import java.awt.List; import java.util.ArrayList; /************************************************* ...

  2. java 正则 标签内容_java正则匹配html片段,并取得标签中的内容

    最近java群好友发来一个html代码,要帮忙匹配查找html代码里面特定的内容: 代码如下: 年代:2013年 朝向:东北 楼层:第10层(共33层) 结构:平层 装修:毛坯 住宅类别:普通住宅 建 ...

  3. java替换特殊字符_Java StringBuffer替换特殊字符

    在本实例中为保证学生输入的 Java 文件名合格,将利用 StringBuffer 类实现对 Java 文件名中的特殊符号进行替换,包括将中文状态下的"."和全角状态下的" ...

  4. java 正则高级应用_JAVA正则表白式高级用法(分组与捉拿).

    ((A)(B(C)))/A(B(C))(C) 组零始终代表全副表白式 之因而这么命名捉拿组是因为在相称中,保留了与这些组相称的输入序列的每个子序列.捉拿的子序列稍后能够穿越 Back 引用在表白式中利 ...

  5. java 修改word属性_Java修改/替换Word批注

    本文将介绍通过Java程序 来修改或替换Word文档中已有的批注内容.修改或替换方法包括: 使用新的文本替换原有批注中的文本 使用新的文本替换原有批注中的图片 使用新的图片替换原有批注中的图片 使用工 ...

  6. java正则表达式 替换空格_Java正则表达式替换移除空行和多余的空格

    这几天重拾Java写代码,须要操做文本文件中的内容.正则表达式 最终,要把内容里的空行和多余的连续空格移除,使用String里的replace或者replaceAll,试了不少次都没有成功.spa 最 ...

  7. java歌词解析器_JAVA 正则解析歌词

    //目录结构 //来看一下歌词内容 [00:00.00]领袖音乐分享平台 http://www.kugou.com [00:02.31]Pretty boy-M2M 英俊男孩 JY93653制作 [0 ...

  8. java 正则 html 标签_Java正则 HTML 标签 得到 纯文本

    public static String Html2Text(String inputString){ String htmlStr = inputString; //含html标签的字符串 Stri ...

  9. java 正则出特殊字符_java正则_特殊字符处理

    一.特殊字符转义 点的转义:. ==> \\u002E 美元符号的转义:$ ==> \\u0024 乘方符号的转义:^ ==> \\u005E 左大括号的转义:{ ==> \\ ...

最新文章

  1. [Android]手动触发OnClick事件
  2. 使用Python在Selenium WebDriver中获取WebElement的HTML源代码
  3. careercup-高等难度 18.5
  4. 监控软件nagios错误总结
  5. 刚刚,阿里云知行动手实验室正式开放公测了
  6. 单位脉冲信号与单位冲激信号的区别
  7. .NET 也有 Husky 了
  8. python静态变量_python静态变量
  9. 解密Go协程的栈内存管理
  10. ASP.NET验证码的实现
  11. 华为P40系列发布时间或敲定:继续在3月26日亮相?
  12. java字符串内存长度固定_深入理解 Java String#intern() 内存模型
  13. oracle-第N篇加强专题
  14. ios、iphone越狱获取系统文件权限
  15. 数十万互联网从业者的共同关注!
  16. 苹果有arkit,android,ARKit来袭:苹果ar支持哪些设备,苹果手机怎么使用ar?
  17. GitLab-Runner 从安装到配置到入门
  18. int *pa[5]中的pa是什么
  19. Windows CMD命令行一启动就闪退问题解决
  20. 运营商大数据的市场价值有那些作用?

热门文章

  1. 图论--最近公共祖先LCA
  2. 2013美国火爆科幻片【僵尸世界大战】清晰版下载
  3. 实现一个输出字符串中各个字符出现的频率frequency函数
  4. 职业秘书写给女友的求婚信
  5. Java—实现 RPG 人物生成器
  6. 盘点:2018年25个最佳数据可视化作品都在这了!
  7. 计算机辅助教学在语文上应用,计算机辅助教学在语文教学过程中的运用-小学语文论文-语文论文-教师论文.docx...
  8. android微信分享 sendreq 返回true 不跳转,使用微信开放平台接口,为什么sendReq一个文本消息,返回值为true,但是发不出去?...
  9. Python 学习8-数据可视化1
  10. 执法机构洋气了:网络黑产市场遭警告