在具有Java正则表达式问题的组之间插入连字符

时间:2015-06-30 20:18:50

标签: java regex

我正在执行测试以查找和替换3或4个大写字母的字符串,后跟带有相同字符串,连字符和相同数字的数字。在Perl中,我可以使用:

s/([A-Z]{3,4})([0-9])/$1-$2/g;

我在Java中试过这个,硬编码如下字符串:

public class Test {
    public static void main(String[] args) {
        String test = "TEST1";

        Pattern p = Pattern.compile("([A-Z]{3,4})([0-9])");

        Matcher m = p.matcher(test);
        if (m.find()) {
            m.replaceAll(m.group(1) + "-" + m.group(2));
        }
        System.out.println(test);

    }
}

但没有找到匹配。我的Java语法是错误的还是正则表达式问题?

4 个答案:

答案 0 :(得分:3)

无需使用Pattern / Matcher,您可以这样做:

test = test.replaceAll( "([A-Z]{3,4})([0-9])", "$1-$2");

答案 1 :(得分:1)

Matcher.replaceAll()将返回一个String,而不是替换内联。

如下所示:http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#replaceAll%28java.lang.String%29

答案 2 :(得分:1)

您只需使用replaceAll和您已有的正则表达式:

String test = "TEST1";
System.out.println(test.replaceAll("([A-Z]{3,4})([0-9])", "$1-$2"));

请参阅IDEONE demo

这是docs

  

public String replaceAll(String regex, String replacement)
  将与给定正则表达式匹配的此字符串的每个子字符串替换为给定的替换。

答案 3 :(得分:0)

replaceAll'将输入序列的每个子序列替换为与给定替换字符串匹配的模式。'

你已经在整个输入字符串上匹配,并且替换它是全部的;您也可以从匹配的组中创建一个新的字符串。

import org.junit.Test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;

public class RegexTest {

    @Test
    public void regexReplaceSingleOccurance() {
        String test = "TEST1";
        String expectedOutput = "TEST-1";
        String replaceAllOutput = null;
        String concatenationOutput = null;

        Pattern p = Pattern.compile("([A-Z]{3,4})([0-9])");

        Matcher m = p.matcher(test);
        if (m.find()) {
            out = m.replaceAll(m.group(1) + "-" + m.group(2));
        }
        assertThat(replaceAllOutput, equalTo(expectedOutput));
        assertThat(concatenationOutput, equalTo(expectedOutput));
    }
}