当前位置: 首页 > 面试题库 >

Java PatternSyntaxException:字符串替换非法重复吗?

吴浩博
2023-03-14
问题内容

我试图写将接受的方法String,检查是否有某些记号的情况下(例如${fizz}${buzz}${foo}等),并更换每个令牌与新的字符串,它是从获取Map<String,String>

例如,如果我将此方法传递给以下字符串:

“现在的$ {fizz}母牛如何。$ {buzz}的形状奇怪的$ {foo}。”

并且如果该方法参考了以下内容Map<String,String>

Key             Value
==========================
"fizz"          "brown"
"buzz"          "arsonist"
"foo"           "feet"

那么结果字符串将是:

“现在是棕色的母牛。纵火犯的脚怪异。”

这是我的方法:

String substituteAllTokens(Map<String,String> tokensMap, String toInspect) {
    String regex = "\\$\\{([^}]*)\\}";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(toInspect);
    while(matcher.find()) {
        String token = matcher.group();     // Ex: ${fizz}
        String tokenKey = matcher.group(1); // Ex: fizz
        String replacementValue = null;

        if(tokensMap.containsKey(tokenKey))
            replacementValue = tokensMap.get(tokenKey);
        else
            throw new RuntimeException("String contained an unsupported token.");

        toInspect = toInspect.replaceFirst(token, replacementValue);
    }

    return toInspect;
}

运行此命令时,出现以下异常:

Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal repetition near index 0
${fizz}
^
    at java.util.regex.Pattern.error(Pattern.java:1730)
    at java.util.regex.Pattern.closure(Pattern.java:2792)
    at java.util.regex.Pattern.sequence(Pattern.java:1906)
    at java.util.regex.Pattern.expr(Pattern.java:1769)
    at java.util.regex.Pattern.compile(Pattern.java:1477)
    at java.util.regex.Pattern.<init>(Pattern.java:1150)
    at java.util.regex.Pattern.compile(Pattern.java:840)
    at java.lang.String.replaceFirst(String.java:2158)
    ...rest of stack trace omitted for brevity (but available upon request!)

我为什么得到这个? 正确的解决方法是什么?提前致谢!


问题答案:

${fizz}

{是正则表达式引擎的指示符,您即将开始一个重复指示符,例如{2,4},它表示“前一个标记的2到4倍”。但是{f是非法的,因为它必须后面跟数字,所以会引发异常。

您需要转义所有正则表达式元字符(在本例中${})(尝试使用http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#quote(java.lang
.String)
),或使用另一种方法将字符串替换为字符串,而不是将正则表达式替换为字符串。



 类似资料:
  • 假设我有一个字符串,如下所示: 我想把“abcd”换成“dddd”。我曾试图做这样的事: 它不起作用。有什么建议吗? 编辑:更具体地说,我在Java工作,我试图解析超文本标记语言文档,具体地说

  • 如何使用bash将字符串中的替换为? 例如: txt文件包含如下文本: 这必须转化为: 我试过了 但这不管用。 这是怎么回事?

  • 给定一个包含项a和B的字符串M,我想用每个a来代替B,用每个B来代替a来代替M'。天真地,人们会尝试用B代替A,然后用A代替B,但在这种情况下,M'只包含A。我可以想到替换这些项,并记录它们的位置,这样这些项就不会再被替换了。当我们只有A和B可以替换时,这是有效的。但是如果我们需要替换两个以上的项,而且它们的长度不同,那么这就变得很棘手了。 所以我想这样做: 我们将M作为输入字符串,并将R=[(x

  • 如何删除字符串中任意位置的圆括号?

  • 问题内容: 我有一个以字符串形式传递的句子,我正在对单词“ and”进行替换,我想用“”替换它。而且它不是用空格替换“和”一词。以下是我的逻辑示例。而当我调试此逻辑时,逻辑确实落入了句子。 这里有我想念的东西吗? 问题答案: 而当我调试此逻辑时,逻辑确实落入了句子。 是的,然后你放弃返回值。 Java中的字符串是不可变的-当你调用时,它不会更改现有字符串的内容-它会返回经过修改的新字符串。所以你要

  • 我有一个作为字符串传入的句子,我正在对单词“and”进行替换,我想用“”替换它。它并没有用空白代替“和”。下面是我的逻辑示例。当我调试这个的时候,逻辑就落在句子里了。代替 这里有我遗漏的东西吗。