为了账号安全,请及时绑定邮箱和手机立即绑定

Java正则表达式替换为捕获组

/ 猿问

Java正则表达式替换为捕获组

慕婉清6462132 2019-11-15 13:06:36

有什么方法可以用捕获组的已修改内容替换正则表达式?


例:


Pattern regex = Pattern.compile("(\\d{1,2})");

Matcher regexMatcher = regex.matcher(text);

resultString = regexMatcher.replaceAll("$1"); // *3 ??

我想用$ 1乘以3代替所有出现的情况。


编辑:


看起来好像出了点问题:(


如果我用


Pattern regex = Pattern.compile("(\\d{1,2})");

Matcher regexMatcher = regex.matcher("12 54 1 65");

try {

    String resultString = regexMatcher.replaceAll(regexMatcher.group(1));

} catch (Exception e) {

    e.printStackTrace();

}

引发IllegalStateException:找不到匹配项



Pattern regex = Pattern.compile("(\\d{1,2})");

Matcher regexMatcher = regex.matcher("12 54 1 65");

try {

    String resultString = regexMatcher.replaceAll("$1");

} catch (Exception e) {

    e.printStackTrace();

}

工作正常,但我不能更改$ 1 :(




查看完整描述

3 回答

?
青春有我

怎么样:


if (regexMatcher.find()) {

    resultString = regexMatcher.replaceAll(

            String.valueOf(3 * Integer.parseInt(regexMatcher.group(1))));

}

要获得第一场比赛,请使用#find()。之后,您可以#group(1)用来引用此第一个匹配项,并将所有匹配项替换为第一个匹配值乘以3。


如果您想将每个匹配项替换为该匹配项的值乘以3:


    Pattern p = Pattern.compile("(\\d{1,2})");

    Matcher m = p.matcher("12 54 1 65");

    StringBuffer s = new StringBuffer();

    while (m.find())

        m.appendReplacement(s, String.valueOf(3 * Integer.parseInt(m.group(1))));

    System.out.println(s.toString());

您可能需要浏览Matcher的文档,其中详细介绍了更多内容。


查看完整回答
反对 回复 2019-11-15
?
侃侃尔雅

伯爵的答案为您提供了解决方案,但我想我要补充一下造成您问题的原因IllegalStateException。您在调用时group(1)无需先调用匹配操作(例如find())。如果您只是在使用$1replaceAll()则不需要此操作,因为这是匹配操作。


查看完整回答
反对 回复 2019-11-15
?
慕尼黑的夜晚无繁华

资料来源:java-implementation-of-rubys-gsub


用法:


// Rewrite an ancient unit of length in SI units.

String result = new Rewriter("([0-9]+(\\.[0-9]+)?)[- ]?(inch(es)?)") {

    public String replacement() {

        float inches = Float.parseFloat(group(1));

        return Float.toString(2.54f * inches) + " cm";

    }

}.rewrite("a 17 inch display");

System.out.println(result);


// The "Searching and Replacing with Non-Constant Values Using a

// Regular Expression" example from the Java Almanac.

result = new Rewriter("([a-zA-Z]+[0-9]+)") {

    public String replacement() {

        return group(1).toUpperCase();

    }

}.rewrite("ab12 cd efg34");

System.out.println(result);

实施(重新设计):


import static java.lang.String.format;


import java.util.regex.Matcher;

import java.util.regex.Pattern;


public abstract class Rewriter {

    private Pattern pattern;

    private Matcher matcher;


    public Rewriter(String regularExpression) {

        this.pattern = Pattern.compile(regularExpression);

    }


    public String group(int i) {

        return matcher.group(i);

    }


    public abstract String replacement() throws Exception;


    public String rewrite(CharSequence original) {

        return rewrite(original, new StringBuffer(original.length())).toString();

    }


    public StringBuffer rewrite(CharSequence original, StringBuffer destination) {

        try {

            this.matcher = pattern.matcher(original);

            while (matcher.find()) {

                matcher.appendReplacement(destination, "");

                destination.append(replacement());

            }

            matcher.appendTail(destination);

            return destination;

        } catch (Exception e) {

            throw new RuntimeException("Cannot rewrite " + toString(), e);

        }

    }


    @Override

    public String toString() {

        StringBuilder sb = new StringBuilder();

        sb.append(pattern.pattern());

        for (int i = 0; i <= matcher.groupCount(); i++)

            sb.append(format("\n\t(%s) - %s", i, group(i)));

        return sb.toString();

    }

}


查看完整回答
反对 回复 2019-11-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信