java 中的$_在Java中使用正则表达式进行后向引用($1,$2...)

2012-04-25 — Yanbin

自 JDK1.4 引入正则表达式的支持可称得上是次大改变,可 Java 的正则表达式的能力还是很弱,别说和 Perl 比了,就是和 C# 和 JavaScript 的正则表达式比较来也逊色不少,不过现在 JVM 上有其他语言对正则表达式有所增强,像 Groovy, jRuby 和 Scala。

[修正一下] 第一句话的说法是有误的,其实 JDK 本身的正则表达式就支持替换时用 $1, $2 那样的后向分组引用,例如:

String s = "abc def".replaceAll("(\\w+)\\s+(\\w+)", "$2 $1"); //s 就是 "def abc",replaceFirst 也可以用 $1, $2 的替换。

比如在 Java 中要实现正则表达式的分组,后向引用的方式进行替换挺复杂的,像 JavaScript 完成两个分组的调换

var src = "abc def";

var des = src.replace(/(\w+)\s+(\w+)/, "$2 $1");

document.write(des);

//输出为: def abc

在 Java 中可得用上 Pattern, Matcher,还要 find()/group() 等操作,于是我就会考虑在 Java 中完成类似的功能有没有曲线的方法,有的。你可以调用 JVM 上其他语言的功能,我这里用列了两种实现方式:

JDK1.6 起可借助 ScriptEngineManager 使用 JavaScript 相应的函数,除此之外还可用第三方的库 JRegex,具体实现,请参见如下代码,还带了测试用例:

package cc.unmi.utils;

import javax.script.Invocable;

import javax.script.ScriptEngine;

import javax.script.ScriptEngineManager;

import jregex.Pattern;

import jregex.Replacer;

public class StringUtils {

public static String replaceStringByJS(String src, String jsRegex, String replacement) {

ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("JavaScript");

String script =

"function rep(target, regex, replacement){\n"

+ " var patt = new RegExp(regex,'g');\n"

+ " return target.replace(patt, replacement);\n"

+ "}";

try {

engine.eval(script);

Invocable inv = (Invocable) engine;

String result = (String) inv.invokeFunction("rep", src, jsRegex,

replacement);

return result;

} catch (Exception e) {

throw new RuntimeException(e);

}

}

public static String replaceStringByJRegex(String src, String regex, String replacement) {

Pattern pattern = new Pattern(regex);

Replacer replacer = pattern.replacer(replacement);

String result = replacer.replace(src);

return result;

}

public static void main(String[] args) {

String link="\"Home\""

+"\"Java\"";

String jsString = StringUtils.replaceStringByJS(link,

"\\\"(.+?)\\\"", "$2");

System.out.println(jsString);

String jregexString = StringUtils.replaceStringByJRegex(link,

"\\\"(.+?)\\\"", "$2");

System.out.println(jregexString);

}

/*

* 程序输出

* HomeJava

* HomeJava

*/

}

起初我是用的第一种方法,后来找到了第二种方式,感觉用 JRegex 更优雅些。

本文链接 http://unmi.cc/java-regex-replace-string/, 来自 隔叶黄莺 Unmi Blog

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值