正则表达式中\ W,\\ W,[^ a-zA-Z0-9_]之间的差异

时间:2015-05-22 12:53:02

标签: java regex string escaping

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

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

但是,以下代码甚至无法用Java编译

stringA.replaceAll("\W","") or stringA.replaceAll("[\W]","") or 
stringA.replaceAll("[\\W]","")<br />


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

1 个答案:

答案 0 :(得分:1)

  

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

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

  

如果我仅使用\\W而不是\W,则上述代码证明是正确的。

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

  

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

第三个是第二个版本的较长版本;第一个不编译。