通常情况下,使用正则表达式时,我可以使用$
运算符引用捕获的组,如下所示:
value.replaceAll("([A-Z])", "$1");
我想知道的是,在某种程度上可以在方法调用中使用捕获的值,然后用方法的返回值替换组,如下所示:
value.replaceAll("([A-Z])", foo("$1"));
以上述方式执行此操作不起作用,不出所料,传入的字符串不是捕获的组,而是字符串"$1"
。
有什么方法可以将捕获的值用作某种方法的参数?可以吗?
答案 0 :(得分:5)
是的,这是可能的,但您无法使用$1
构造,正如您正确指出的那样。
您最好的选择是使用Pattern
和Matcher
。
这是一个例子来说明:
import java.util.regex.*;
public class Test {
public static String foo(String str) {
return "<b>" + str + "</b>";
}
public static void main(String[] args) {
String content = "Some Text";
Pattern pattern = Pattern.compile("[A-Z]");
Matcher m = pattern.matcher(content);
StringBuffer sb = new StringBuffer();
while (m.find())
m.appendReplacement(sb, foo(m.group()));
m.appendTail(sb);
System.out.println(sb);
}
}
<强>输出:强>
<b>S</b>ome <b>T</b>ext
答案 1 :(得分:1)
replaceAll方法在第二个参数的参数字符串中允许$1
- 所以你的foo方法必须返回一个带有$1
的字符串,然后将被替换。
如果要将捕获的组传递给方法,则不能使用replaceAll - 您必须使用此正则表达式的匹配器,调用find()
然后您可以使用.group(1)
获取与第一个组对应的字符串,然后您可以将其用作替换。
看起来aioobe比我快,所以我不必在这里输入源代码。
答案 2 :(得分:-1)
通常在PCRE正则表达式中反向引用为\1
。也许你可以试试这个。