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

5

我有这个正则表达式:

private static final String SPACE_PATH_REGEX ="[a-z|A-Z|0-9|\\/|\\-|\\_|\\+]+";

我检查我的字符串是否与这个正则表达式匹配,如果不匹配,我想用“_”替换所有不在此处的字符。

我尝试过以下方法:

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, "_");
}

但它没有起作用……所以在第二个正则表达式中,"~"似乎没有省略后面的字符。

有什么想法吗?

2个回答

8
您的正则表达式存在以下问题(参见规则:Pattern):
  • 在字符类中,|没有特殊意义,应该删除而不是替换它(除非您想让您的字符类包括字面上的|字符)。
  • 同样,在字符类中,您不需要转义/_+
  • 仅当-不是最后一个字符时才需要转义-
  • ~在字符类中也没有特殊含义,只代表它自己。
  • 您将要使用^来否定字符组的内容。

您也可以跳过第一个matches()检查,因为如果没有任何匹配,replaceAll()调用将返回未修改的字符串。保留它(和第二个正则表达式)只会引入另一个可能隐藏错误的地方(例如,您可能会意外更新一个正则表达式,但未更新另一个)。


5

尝试:

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放入模式中以查找换行符的序列。
对于转义一堆文本,您有两个方便的选项:
1. 您可以使用\Q...\E。在\Q\E之间的任何内容都被转义;并且
2. 您可以使用Pattern.quote()引用任意字符串。
在哪里需要转义正则表达式中的某些序列是有上下文的。例如,只有当连字符可能被误认为指示范围时,才需要转义连字符-[a-z]表示小写字母。[a\-z]表示其中的一个:a-z。但是您可以使用-[a-z]表示横线后跟一个小写字母。请注意:您不需要对第一个连字符进行转义。

我认为你需要转义“-”。 - Matthew Flaschen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接