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]
来表示连字符后跟小写字母注意:您不需要转义第一个连字符。我认为您需要转义-