【问题标题】:Escape special characters like + in Java转义特殊字符,如 Java 中的 +
【发布时间】:2020-06-21 09:25:02
【问题描述】:

我想转义字符串中的所有特殊字符。

输入字符串: Foo+Bar

输出字符串: Foo\+Bar

所以+ 应该转义为\+。这是必需的,因为我必须将结果字符串作为正则表达式模式传递给 Postgres SQL,所以如果我只传递 + 它会导致异常。

我尝试过使用apache-commons:commons-text ,但这并没有逃脱String中的+

【问题讨论】:

    标签: java postgresql escaping psql apache-commons


    【解决方案1】:

    如果你修改自定义模式,下面special,这可能会做你想要的。

            String special = "([\\[\\]()+*.])";
            String str = "This is (a test) of [how to ] escape things like +, *, and .";
            str = str.replaceAll(special, "\\\\$1");
            System.out.println(str);
    
    • $1 是对匹配的特殊字符的反向引用。
    • \\\\ 需要转义转义符以允许在替换中出现斜杠。

    【讨论】:

    • 这行得通,但为此,我必须在 special 字符串中包含所有特殊字符?
    • 是的。如果这是用于正则表达式,您还可以使用 Michal Kordas 想法来转义整个字符串?
    • 好的。我尝试了 Pattern#quote(String) 但这对+ 不起作用。是的,此字符串将用作数据库层中的正则表达式,即psql
    • @VGR 我确定我做到了。这只是一个例子。我认为 OP 可以定制它,因为我不知道转义的目的是什么。
    【解决方案2】:

    有一种方法可以用纯 Java 做到这一点。使用Pattern#quote(String) 转义所有与正则表达式相关的字符。

    【讨论】:

    • 是的。这只是封装了\Q\E 之间的字符串。我不确定这是 OP 想要的。
    • 我试过了,但这并没有像预期的那样将+ 更改为\+
    • @RajRajeshwarSinghRathore 如果您正在寻找视觉说明,它不会更改任何特殊字符。它只是将它们与正则表达式引擎隔离开来。
    • 那么听起来您需要转义字符串以绕过psql 才能进入正则表达式解析器。可能是因为psql 不理解\Q\E 的含义。但这只是一个猜测。我无法提供任何其他解决方案。
    • \Q...\E 特定于 java 正则表达式,在 PostgreSQL 中不起作用。 Pattern.quote 也根据 Java 正则表达式引用,所以我不确定我是否要依赖它。快速搜索后,qflag 使正则表达式的其余部分在 postgresql 中被解释为文字字符,并且可以在必要时用作内联标志 (?q)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 2010-11-16
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多