繁体   English   中英

Java中的自定义正则表达式替换

[英]Custom Regex Replacement in Java

我想在字符串中找到与正则表达式匹配的所有模式:no =“(\\ d +)”然后用其他东西替换组中的数字。

在下面的方法中,我可以找到并替换整个匹配,但这不是我想要的。 有没有办法只替换那场比赛的一部分?

private String replaceStringFromPatternSearch(String stringToSearch, String patternString, String replacementString) {
    String replacedString = null;
    Pattern stringPattern = Pattern.compile(patternString);

    Matcher stringMatcher = stringPattern.matcher(stringToSearch);
    replacedString = stringMatcher.replaceAll(replacementString);
    if (replacedString != null) {
        return replacedString;
    } else {
        return stringToSearch;
    }
}

Java中没有回调/ Lambda取代,但我们有其他选择

选项1:在替换功能中使用捕获缓冲区

replaceAll ,您可以从诸如捕获的文本和当时要插入的字符串等组件构建替换。 这是一个例子:

String replaced = yourString.replaceAll("no=\"(\\d+)\"", 
                                         "Something $1 Something else");

在替换中, $1是捕获的数字。 您不必使用它们,但正如您所看到的,您可以围绕它们构建替换字符串。

选项2(替换Lambda / Callback / Delegate Equivalent):一次构建一个匹配

在Java中,为了构建更复杂的替换,我们没有替换lambdas,但我们可以这样做:

StringBuffer resultString = new StringBuffer();
Pattern regex = Pattern.compile("no=\"(\\d+)\"");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
        // You can vary the replacement text for each match on-the-fly
        // String computed_replacement = .... Something wild!
        regexMatcher.appendReplacement(resultString, computed_replacement );
    } 
regexMatcher.appendTail(resultString);

你可以使用lookarounds,这样匹配只会是数字:

(?<=no=")\d+(?=")

正则表达式可视化

Debuggex演示

这两种方法都解决了我的问题:

示例数据:<detail type =“07”time =“100611”no =“07040365089”detail“>

我认为我想用其他东西替换07040365089。 no =“\\ d”在实际数据中多次出现。 不同模式还需要其他替换。

private String replaceStringFromPatternSearch2(String stringToSearch, String patternString, String replacementString) {
    String replacedString = "";
    Pattern stringPattern = Pattern.compile(patternString);
    int startSearch = 0;
    Matcher stringMatcher = stringPattern.matcher(stringToSearch);
    while (stringMatcher.find(startSearch)) {
        int start = stringMatcher.start(1);
        int end = stringMatcher.end(1);
        replacedString += stringToSearch.substring(startSearch, start) + replacementString + stringToSearch.substring(end);
        startSearch = end + 1;
    }
    if (!replacedString.isEmpty()) {
        return replacedString;
    } else {
        return stringToSearch;
    }
}

private String replaceStringFromPatternSearch(String stringToSearch, String patternString, String replacementString) {
    String replacedString = "";
    Pattern stringPattern = Pattern.compile(patternString);
    int startSearch = 0;
    Matcher stringMatcher = stringPattern.matcher(stringToSearch);
    StringBuffer sb = new StringBuffer();
    while (stringMatcher.find()) {
        String wholeGroup = stringMatcher.group(0);
        replacedString = wholeGroup.replace(stringMatcher.group(1), replacementString);
        stringMatcher.appendReplacement(sb, replacedString);
    }
    stringMatcher.appendTail(sb);
    if (sb.length() > 0) {
        return sb.toString();
    } else {
        return stringToSearch;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM