【问题标题】:Differences between \W, \\W, [^a-zA-Z0-9_] in regular expression正则表达式中\W、\\W、[^a-zA-Z0-9_]的区别
【发布时间】:2015-05-22 12:53:01
【问题描述】:

我正在尝试查找所有字符,而不是字母(大写/小写)、数字和下划线,并将其删除。

stringA.replaceAll("[^a-zA-Z0-9_]","")   // works perfectly fine

但是,以下代码甚至无法在 Java 中编译:

stringA.replaceAll("\W","");
// or also
stringA.replaceAll("[\W]","");
// or also
stringA.replaceAll("[\\W]","");

如果我只使用"\\W" 而不是"\W",那么上面的代码是正确的。
那么,\W\\W 之间有什么区别,以及何时使用像 [^a-zA-Z0-9_] 这样的括号

【问题讨论】:

  • 再次转义反斜杠。并且不要忘记在最后添加分号。 stringA.replaceAll("\\W","");
  • 逃离逃脱者! \ 不仅是一个正则表达式转义字符,它也是一个 Java 转义字符!

标签: java regex string escaping


【解决方案1】:

但是,下面的代码甚至无法在 Java 中编译

Java 不知道该字符串将进入正则表达式引擎。双引号中的任何内容都是 Java 编译器的字符串文字,因此它会尝试将 \W 解释为不存在的 Java escape sequence。这会触发编译时错误。

如果我只使用\\W 而不是\W,那么上面的代码是正确的。

这是因为\\ 是一个有效的转义序列,意思是“单斜杠”。当您在字符串文字中放置两个斜杠时,Java 编译器会删除一个斜杠,因此正则表达式引擎会看到 \W,而不是 \\W

那么,\W\\W 之间有什么区别,以及何时使用像 [^a-zA-Z0-9_] 这样的括号

第三个是第二个的加长版本;第一个没有编译。

【讨论】:

    猜你喜欢
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 2010-12-11
    • 2021-11-09
    • 2012-12-31
    • 1970-01-01
    • 2019-03-05
    相关资源
    最近更新 更多