【问题标题】:Escaping a long sequence of metacharacters in the Java .replaceAll method在 Java .replaceAll 方法中转义一长串元字符
【发布时间】:2018-03-05 07:10:33
【问题描述】:

我已经尝试解决这个问题一段时间了,我正在使用 .replaceAll 删除字符串中不是字母或数字的任何字符。我尝试使用 Pattern.quote(),但无法使其正常工作。然后我尝试使用 \Q 和 \E,但它仍然无法正常工作,即使我对不同数量的反斜杠的尝试感到沮丧。这是我第一次尝试以这种方式逃跑,所以非常感谢任何帮助。

这是有问题的行:

return input.toLowerCase().replaceAll("\\Q !"#$%&'()*+,-./:;<=>?@[]\^_`~{}|\\E","");

【问题讨论】:

    标签: java regex escaping replaceall metacharacters


    【解决方案1】:

    这里的一个简单解决方法是将所有特殊字符放在一个字符类中:

    String input = "abc%#$123";
    input = input.toLowerCase().replaceAll("[!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`~{}|]","");
    System.out.println(input);
    
    abc123
    

    字符类承认您的大多数特殊字符都是未转义的文字。例外情况是双引号、反斜杠和打开/关闭方括号,但它们仍然需要转义。

    Demo

    注意:删除任何不是字母数字的东西可能会容易得多,例如

    input = input.replaceAll("[^A-Za-z0-9]", "");
    

    但也许有上面会排除但你真的想保留的字符。

    【讨论】:

    • ,-. 需要转义。
    • @Pshemo No they don't,除了破折号,正如您所指出的,它应该移到字符类的最后。
    • @TimBiegeleisen:为了挑剔,一开始也可以。
    • OK 实际上 ,-. 指定的范围仅匹配 , -. 所以这将起作用(运气好)。但是为了使正则表达式更易于使用,我们应该转义 -,当我们的意思是它是文字而不是范围指示符时。
    • - 放在末尾(或开头)而不转义感觉很危险:有人可能会出现并在之后(或之前)添加更多字符。保存两个反斜杠感觉就像是假经济。
    【解决方案2】:

    return input.toLowerCase().replaceAll("[^A-Za-z0-9()\[\]]", "");

    来源:How to remove invalid characters from a string?

    【讨论】:

    • 放开我的?和?。这删除的不仅仅是 OP 的代码
    • @AndyTurner 哇!这些图标是从哪里来的?苏打水不配比萨,而不是啤酒吗?
    • @TimBiegeleisen 他们只是普通的 unicode 表情符号:??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    相关资源
    最近更新 更多