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

时间:2010-04-09 11:07:34

标签: java regex

我有这个正则表达式:

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 个答案:

答案 0 :(得分:8)

您的正则表达式有几个问题(请参阅Pattern class了解规则):

  • 在字符类|中没有特殊含义,在您的情况下应该删除而不替换(除非您希望您的字符类包含文字|字符)。
  • 同样,您无需在字符类中转义/_+
  • -只需要逃脱,如果它不是最后一个字符
  • ~在它自己代表的角色类中也没有特殊含义
  • 您需要使用^来否定字符组的内容。

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

答案 1 :(得分:5)

尝试:

final String SPACE_PATH_REGEX_EXCLUDE = "[^\\w~/\\-+]";
String out = in.replaceAll(SPACE_PATH_REGEX_EXCLUDE, "_");

您遇到的主要问题是您在模式中添加了不必要的|。它们有不同的含义。此外,您可以使用\w来大大简化您的表达,这意味着“单词字符”,意思是字母(大写或小写),数字或下划线,并且与[A-Za-z0-9_]同义。

此外,您还需要了解转义是如何运作的。有Java字符串转义,这就是你放入\\将一个反斜杠放入模式的原因。但也有正则表达式逃避。例如,\n是Java String换行符,\\n是将\n放入模式以查找换行符的序列。

有两个方便的选项来转义大量文本:

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

  2. 您可以使用Pattern.quote()引用任意字符串。

  3. 你需要在正则表达式中转义某些序列的是上下文。例如,-只有在被误认为是指示范围时才需要进行转义。 [a-z]是一个小写字符。 [a\-z]a-z中的一个。但您可以-[a-z]指示连字符后跟小写字母。 注意:您无需转义第一个连字符。