Java 替换与正则表达式中的字符不匹配的字符

Java 替换与正则表达式中的字符不匹配的字符,java,regex,Java,Regex,我有一个正则表达式: private static final String SPACE_PATH_REGEX ="[a-z|A-Z|0-9|\\/|\\-|\\_|\\+]+"; 我检查我的字符串是否与这个正则表达式匹配,如果不匹配,我想用“\ux”替换所有不在这里的字符 我试过: private static final String SPACE_PATH_REGEX_EXCLUDE = "[~a-z|A-Z|0-9|\\/|\\-|\\_|\\+]+"; if (myCo

我有一个正则表达式:

private static final String SPACE_PATH_REGEX ="[a-z|A-Z|0-9|\\/|\\-|\\_|\\+]+";
我检查我的字符串是否与这个正则表达式匹配,如果不匹配,我想用“\ux”替换所有不在这里的字符

我试过:

private static final String SPACE_PATH_REGEX_EXCLUDE =
        "[~a-z|A-Z|0-9|\\/|\\-|\\_|\\+]+";
if (myCompanyName.matches(SPACE_PATH_REGEX)) {
    myNewCompanySpaceName = myCompanyName;
} else{
    myNewCompanySpaceName = myCompanyName.replaceAll(
            SPACE_PATH_REGEX_EXCLUDE, "_");
}
但是它不起作用…,所以在第二个正则表达式中“~”似乎没有忽略以下字符


有什么想法吗?

您的正则表达式有几个问题(有关规则,请参阅):

  • 字符类内部的
    |
    没有特殊含义,在您的情况下应该删除而不替换(除非您希望您的字符类包含文字
    |
    字符)
  • 类似地,您不需要在字符类中转义
    /
    \uu
    +
  • -
    仅当不是最后一个字符时才需要转义
  • ~
    在字符类中也没有特殊意义,它只是表示自身
  • 您需要使用
    ^
    对字符组的内容求反
您还可以跳过第一个
matches()
检查,因为
replaceAll()
调用将返回一个未修改的字符串,如果没有任何匹配项。保留它(以及第二个正则表达式)只会引入另一个bug可能隐藏的地方(例如,您可能会意外地更新一个正则表达式,但不会更新另一个)。

尝试:

final String SPACE_PATH_REGEX_EXCLUDE = "[^\\w~/\\-+]";
String out = in.replaceAll(SPACE_PATH_REGEX_EXCLUDE, "_");
您面临的主要问题是将不必要的
|
添加到模式中。它们有不同的含义。此外,您还可以使用
\w
,这意味着“单词字符”,意思是字母(大写或小写)、数字或下划线,与
[A-Za-z0-9]同义

您还需要了解转义是如何工作的。有Java字符串转义,这就是为什么要在模式中加上一个反斜杠。但也有正则表达式在逃逸。例如,
\n
是Java字符串换行符,
\\n
是将
\n
放入模式以查找换行符的序列

对于转义一堆文本,有两个方便的选项:

  • 您可以使用
    \Q..\E
    \Q
    \E
    之间的任何内容都将被转义;及

  • 您可以使用来引用任意字符串


  • 在正则表达式中需要转义某些序列的地方是上下文的。例如,
    -
    只有在可能被误认为指示范围时才需要转义<代码>[a-z]
    是小写字符
    [a \-z]
    a
    -
    z
    中的一种。但是您可以使用
    -[a-z]
    来表示连字符后跟小写字母注意:您不需要转义第一个连字符。

    我认为您需要转义
    -