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

Cri*_*riu 5 java regex

我有这个正则表达式:

private static final String SPACE_PATH_REGEX ="[a-z|A-Z|0-9|\\/|\\-|\\_|\\+]+";
Run Code Online (Sandbox Code Playgroud)

我检查我的字符串是否匹配此正则表达式,如果不是,我想用"_"替换所有不在这里的字符.

我尝试过:

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, "_");
}
Run Code Online (Sandbox Code Playgroud)

但是它不起作用......所以在第二个正则表达式"〜"似乎没有省略以下的字符.

任何的想法?

Joa*_*uer 8

你的正则表达式有几个问题(参见规则的Pattern类):

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

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


cle*_*tus 5

尝试:

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

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

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

您有两个方便的选项来转义一堆文本:

  1. 你可以用\Q...\E.之间的任何\Q和\E转义; 和

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

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