正则表达式 - 组值替换

时间:2010-10-20 17:43:15

标签: java regex regex-group

我不确定这是否可行,但我需要一种方法来替换我的regex表达式中指定的编号组的值,并在运行时将动态声明的字符串替换为匹配。

给出一个简单的案例,比如......

(/)?([A-Za-z0-9])?(/)?$

我希望能够为第2组插入替换。

我目前正在使用Java的Matcher类。

3 个答案:

答案 0 :(得分:6)

  

我不确定这是否可行......

是的,这是可能的。请参阅下面的示例。

  

我希望能够为第2组插入替换。

此演示“插入”第2组的.toUpperCase版本作为替代。

import java.util.regex.*;

class Main {
    public static void main(String... args) {
        String input = "hello my name is /aioobe/ and I like /patterns/.";
        Pattern p = Pattern.compile("(/)([A-Za-z0-9]+)(/)");
        Matcher m = p.matcher(input);
        StringBuffer sb = new StringBuffer();
        while (m.find()) {
            String rep = m.group(1) + m.group(2).toUpperCase() + m.group(3);
            m.appendReplacement(sb, rep);
        }
        m.appendTail(sb);
        System.out.println(sb);
    }
}

打印:

hello my name is /AIOOBE/ and I like /PATTERNS/.

答案 1 :(得分:2)

是的,那是可行的。查看我对this question的回答,了解具体方法。事实上,这个问题可能应该以副本的形式结束。

您需要稍微更改正则表达式。我无法确切地说出你要做什么,所以我不能给出任何细节,但至少你应该把所有这些问号都移到这些组中。

(/)?([A-Za-z0-9])?(/)?$  // NO

(/?)([A-Za-z0-9]?)(/?)$  // YES

但它仍会匹配目标字符串末尾的空子字符串,因为除了锚$之外,所有内容都是可选的。这真的是你的意思吗?

答案 2 :(得分:0)

返回正则表达式搜索的值并将其保存到变量中,然后使用正则表达式搜索结果作为查找目标并将动态声明的字符串替换为主字符串替换。

简化概念:

String testString = "Hello there";
//String substring = *Do your regex work here*
if(substring.length() > 0) {
   testString.replace(substring, dynamicallyGeneratedString); 
}