博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java中带回调函数的字符串替换,类似js中的replace(rgExp,function)
阅读量:6213 次
发布时间:2019-06-21

本文共 5467 字,大约阅读时间需要 18 分钟。

  hot3.png

在js中, replace函数的功能很强大,其原型是stringObj.replace(rgExp, replaceText), 而replaceText也可以是返回替换文本的函数。这个功能还是比较好的:
function f2c(s) {    var test = /(\d+(\.\d*)?)℉/g;    return(s.replace(test,function($0,$1,$2) {          return((($1-32) * 5/9) + "℃");        }      )    );  }  alert(f2c("Water freezes at 32℉ and boils at 212℉."));
如果在java中怎么写呢? 
java中的replace方法也很强大,只是不支持回调函数,所以就动手写了个简单的替换工具类:
/** * @author yeyong */public class StringUtils { // 就把它们放在StringUtils工具类中了  /**   * 将String中的所有regex匹配的字串全部替换掉   * @param string 代替换的字符串   * @param regex 替换查找的正则表达式   * @param replacement 替换函数   * @return   */  public static String replaceAll(String string, String regex, ReplaceCallBack replacement) {    return replaceAll(string, Pattern.compile(regex), replacement);  }  /**   * 将String中的所有pattern匹配的字串替换掉   * @param string 代替换的字符串   * @param pattern 替换查找的正则表达式对象   * @param replacement 替换函数   * @return   */  public static String replaceAll(String string, Pattern pattern, ReplaceCallBack replacement) {    if (string == null) {      return null;    }    Matcher m = pattern.matcher(string);    if (m.find()) {      StringBuffer sb = new StringBuffer();      int index = 0;      while (true) {        m.appendReplacement(sb, replacement.replace(m.group(0), index++, m));        if (!m.find()) {          break;        }      }      m.appendTail(sb);      return sb.toString();    }    return string;  }  /**   * 将String中的regex第一次匹配的字串替换掉   * @param string 代替换的字符串   * @param regex 替换查找的正则表达式   * @param replacement 替换函数   * @return   */  public static String replaceFirst(String string, String regex, ReplaceCallBack replacement) {    return replaceFirst(string, Pattern.compile(regex), replacement);  }  /**   * 将String中的pattern第一次匹配的字串替换掉   * @param string 代替换的字符串   * @param pattern 替换查找的正则表达式对象   * @param replacement 替换函数   * @return   */  public static String replaceFirst(String string, Pattern pattern, ReplaceCallBack replacement) {    if (string == null) {      return null;    }    Matcher m = pattern.matcher(string);    StringBuffer sb = new StringBuffer();    if (m.find()) {      m.appendReplacement(sb, replacement.replace(m.group(0), 0, m));    }    m.appendTail(sb);    return sb.toString();  }}

回调类及其一个抽象类: 

/** * 字符串替换的回调接口 * * @author yeyong * */public interface ReplaceCallBack {  /**   * 将text转化为特定的字串返回   * @param text 指定的字符串   * @param index 替换的次序   * @param matcher Matcher对象   * @return   */  public String replace(String text, int index, Matcher matcher);}
/** * 抽象的字符串替换接口 * 

主要是添加了$(group)方法来替代matcher.group(group) * @author yeyong * */public abstract class AbstractReplaceCallBack implements ReplaceCallBack { protected Matcher matcher; /* * (non-Javadoc) * @see utils.ReplaceCallBack#replace(java.lang.String, int, java.util.regex.Matcher) */ final public String replace(String text, int index, Matcher matcher) { this.matcher = matcher; try { return doReplace(text, index, matcher); } finally { this.matcher = null; } } /** * 将text转化为特定的字串返回 * @param text 指定的字符串 * @param index 替换的次序 * @param matcher Matcher对象 * @return */ public abstract String doReplace(String text, int index, Matcher matcher); /** * 获得matcher中的组数据 *

等同于matcher.group(group) *

该函数只能在{@link #doReplace(String, int, Matcher)} 中调用 * @param group * @return */ protected String $(int group) { String data = matcher.group(group); return data == null ? "" : data; }}

测试一下: 

String string = "the quick-brown fox jumps over the lazy-dog."; String pattern = "\\b(\\w)(\\w*?)\\b"; // 将每个单词改为首字大写其他字母小写 System.out.println(StringUtils.replaceAll(string, pattern,   new AbstractReplaceCallBack() {   public String doReplace(String text, int index, Matcher matcher) {     return $(1).toUpperCase() + $(2).toLowerCase();   } })); //输出:The Quick-Brown Fox Jumps Over The Lazy-Dog. // 将文本中类似aaa-bbb-ccc的替换为AaaBbbCcc string = "the quick-brown fox jumps over the lazy-dog. aaa-bbbb-cccc-ddd"; pattern = "\\b\\w+(?:-\\w+)+\\b"; System.out.println(StringUtils.replaceAll(string, pattern,    new AbstractReplaceCallBack() {   private ReplaceCallBack callBack = new AbstractReplaceCallBack() {     public String doReplace(String text, int index, Matcher matcher) {       return $(1).toUpperCase() + $(2).toLowerCase();     }   };   public String doReplace(String text, int index, Matcher matcher) {     return StringUtils.replaceAll(text, "(?:\\b|-)(\\w)(\\w*?)\\b", callBack);   } })); // 输出: the QuickBrown fox jumps over the LazyDog. AaaBbbbCcccDdd //过滤安全字符... TODO 应提取为一个方法 final Map
map = new HashMap
() { private static final long serialVersionUID = 1L; { put("<", "<"); put(">", ">"); put("\"", """); put("'", "'"); } }; ReplaceCallBack callBack = new ReplaceCallBack() { public String replace(String text, int index, Matcher matcher) { return map.get(text); } }; string = "xxxxx 1<4 & 7>5"; System.out.println(StringUtils.replaceAll(string.replace("&", "&"), "[<>\"\']", callBack)); // 输出: <html><body>xxxxx 1<4 & 7>5</body></html>

实现上面js例子的替换: 

// 实现上面js例子的替换  string = "Water freezes at 32℉ and boils at 212℉.";  System.out.println(StringUtils.replaceAll(string, "(\\d+(\\.\\d*)?)℉",     new AbstractReplaceCallBack() {    public String doReplace(String text, int index, Matcher matcher) {      return (((Double.parseDouble($(1)) - 32) * 5 / 9) + "℃");    }  })); // 输出: Water freezes at 0.0℃ and boils at 100.0℃.

转载于:https://my.oschina.net/jsan/blog/185189

你可能感兴趣的文章
右击 -> 查看源文件,和其他一些前端性能测试技巧
查看>>
这56家公司共同发力智慧城市
查看>>
MIT开发Polaris,使网页载入加快34%
查看>>
《Cisco IPv6网络实现技术(修订版)》一2.8 参考文献
查看>>
深圳卓炎科技|企业网站建设|提高内容网站粘度的常见方法
查看>>
OS X Eagle Peak:据说这是 Mac 新系统名称
查看>>
《大规模元搜索引擎技(1)》一1.1 Web上查找信息
查看>>
英国政府采用基于 LibreOffice 的开源办公套件 "GovOffice"
查看>>
为什么年事已高的我还在编程?
查看>>
《Hadoop大数据分析与挖掘实战》——3.4节小结
查看>>
讲讲 2017年 绕不开的双摄
查看>>
阿里云成为 MariaDB 白金赞助商
查看>>
Maven实战
查看>>
《众妙之门——用户体验设计的秘密》一2.5 移动优先的设计
查看>>
聊聊Java中的四种单例模式
查看>>
《Adobe SiteCatalyst网站分析权威手册》一1.4 为什么理解SiteCatalyst是如此重要
查看>>
Java IO: 网络
查看>>
快速选择合适的机器学习算法
查看>>
《Nmap渗透测试指南》—第2章2.7节UDP Ping扫描
查看>>
android 防止反编译的若干方法
查看>>