2011-03-03 95 views
2

通常情况下,使用正则表达式我可以使用$运营商指捕获组,像这样的时候:使用捕获正则表达式组作为参数传递给方法

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

我想知道的是,如果它在某种程度上可能使用捕捉的值在方法调用中,然后用该方法的返回值替换该组,比如:

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

否则它不起作用上述方式,勿庸置疑的字符串传递不被捕获的组但字符串"$1"

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

+2

使用'Matcher'并从那里获取捕获的值。 – NullUserException 2011-03-03 15:57:35

回答

4

是的,这是可能的,但是您不能使用$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 
+0

非常感谢,它像一个魅力! – 2011-03-03 16:10:18

-1

PCRE正则表达式中的反向引用通常是\1。也许你可以试试这个。

+0

这适用于regexp内的反向引用,但不适用于替换之外的引用。 – 2011-03-03 16:03:47

+0

确实。我的错。 – 2011-03-03 16:09:22

1

的的replaceAll方法允许$1在参数字符串的第二个参数 - 所以你foo的方法将不得不返回一个字符串$1,然后将被替换。

如果你想捕获的组传递给方法,你不能使用的replaceAll - 你必须使用一个匹配器与这个正则表达式,调用find()然后你可以用.group(1)得到相应的第一组串,然后您可以使用它作为替代品。

看起来aioobe比我快,所以我不必在这里键入源代码。