繁体   English   中英

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

[英]replace characters which do not match with the ones in a 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, "_");
}

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

任何的想法?

你的正则表达式有几个问题(参见规则的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放入模式以查找换行符的序列。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM