我正在尝试查找所有字符,这些字符不是字母(大写/小写),数字和下划线,并将其删除。
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_]
这样的括号
答案 0 :(得分:1)
但是,以下代码甚至无法在Java中编译
Java不知道该字符串是否会使用正则表达式引擎。双引号中的任何内容都是Java编译器的字符串文字,因此它会尝试将\W
解释为Java escape sequence,但不存在。这会触发编译时错误。
如果我仅使用
\\W
而不是\W
,则上述代码证明是正确的。
这是因为\\
是一个有效的转义序列,这意味着“单个斜杠”。当您在字符串文字中放入两个斜杠时,Java编译器会删除一个斜杠,因此正则表达式引擎会看到\W
,而不是\\W
那么,
\W
,\\W
之间的区别是什么,以及何时使用像[^a-zA-Z0-9_]
这样的括号
第三个是第二个版本的较长版本;第一个不编译。