替换与正则表达式中的字符不匹配的字符
我有这个正则表达式:
private static final String SPACE_PATH_REGEX ="[az|AZ|0-9|\\/|\\-|\\_|\\+]+";
我检查我的字符串是否匹配此正则表达式,如果不是,我想用“_”替换所有不在这里的字符。
我尝试过:
private static final String SPACE_PATH_REGEX_EXCLUDE = "[~az|AZ|0-9|\\/|\\-|\\_|\\+]+"; if (myCompanyName.matches(SPACE_PATH_REGEX)) { myNewCompanySpaceName = myCompanyName; } else{ myNewCompanySpaceName = myCompanyName.replaceAll( SPACE_PATH_REGEX_EXCLUDE, "_"); }
但是它不起作用……所以在第二个正则表达式中,“〜”似乎没有省略下面的字符。
任何想法?
你的正则表达式有几个问题(参见规则的Pattern
类 ):
- 在一个字符类里面 没有特殊意义,在您的情况下应该删除而不替换(除非您希望您的字符类包含文字
|
字符)。 - 类似地,您不需要在字符类中转义
/
,_
和+
。 -
-
如果不是最后一个角色,只需要逃脱 -
~
在它只代表自己的字符类中也没有特殊含义 - 你会想用
^
来否定一个字符组的内容。
你也可以跳过第一个matches()
检查,因为如果没有任何匹配, replaceAll()
调用将返回一个未修改的字符串。 保持它(和第二个正则表达式)只会引入另一个可以隐藏错误的地方(例如,你可能会意外更新一个正则表达式而不是另一个正则表达式)。
尝试:
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
放入模式以查找换行符的序列。
您有两个方便的选项可以转义一堆文本:
-
您可以使用
\Q...\E
\Q
和\E
之间的任何内容都被转义; 和 -
您可以使用
Pattern.quote()
来引用任意字符串。
你需要在正则表达式中转义某些序列的是上下文。 例如-
如果可能被误认为是指示范围,则只需要进行转义。 [az]
是小写字符。 [a\-z]
是a
, -
或z
。 但你可以这样做-[az]
表示一个连字符后跟一个小写字母。 注意:您不需要转义第一个连字符。