使用捕获的正则表达式组作为方法的参数

时间:2011-03-03 15:54:32

标签: java regex

通常情况下,使用正则表达式时,我可以使用$运算符引用捕获的组,如下所示:

value.replaceAll("([A-Z])", "$1"); 

我想知道的是,在某种程度上可以在方法调用中使用捕获的值,然后用方法的返回值替换组,如下所示:

value.replaceAll("([A-Z])", foo("$1"));

以上述方式执行此操作不起作用,不出所料,传入的字符串不是捕获的组,而是字符串"$1"

有什么方法可以将捕获的值用作某种方法的参数?可以吗?

3 个答案:

答案 0 :(得分:5)

是的,这是可能的,但您无法使用$1构造,正如您正确指出的那样。

您最好的选择是使用PatternMatcher

这是一个例子来说明:

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。也许你可以试试这个。