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

在具有Java正则表达式问题的组之间插入连字符,java,regex,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.

我正在执行一个测试,以查找并替换一个由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语法是错误的还是正则表达式问题?

Matcher.replaceAll()
将返回字符串,而不是replace inline


如图所示:

无需使用Pattern/Matcher,您只需执行以下操作:

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

您只需将
replaceAll
与现有的正则表达式一起使用:

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

这是来自:

publicstringreplaceall(stringregex,
字符串替换)

将此字符串中与给定正则表达式匹配的每个子字符串替换为给定替换


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));
    }
}

replaceAll返回替换的新字符串如果Matcher类中有一个名为
replaceAll()
的方法,其原型是什么?请不要在问题中添加“已解决”。啊,是的。尽管如此,find()返回false,因此从未调用过。我尝试了您的示例,对我来说,
find()
返回true,并且正确调用了replace。正则表达式是正确的。可能您在调试器中的
m.find()
上进行了监视?这将修改匹配器并搜索下一个不存在的匹配,因此后续调用返回false。