java - 正则表达式中\W,\\W,[^a-zA-Z0-9_]的区别

标签 java regex string escaping

我试图找到所有不是字母(大写/小写)、数字和下划线的字符,并将其删除。

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_]

最佳答案

However, the following code could not even compile in Java

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

If I use only \\W rather than \W, the above code turns out to be correct.

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

So, what is the differences between \W, \\W, and when to use brackets like [^a-zA-Z0-9_]

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

关于java - 正则表达式中\W,\\W,[^a-zA-Z0-9_]的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30397243/

相关文章:

java - 为什么 StepVerifer 虚拟时间不适用于 Flux?

javascript - 什么时候需要转义正则表达式字符集中的字符([] 内)?

regex - 如何匹配单词中除一个以外的所有拼写?

java - 如何在一次操作中使用 Thymeleaf 检查 null 和空条件?

java - 有什么方法可以计算 HashSet 中同一个 Bucket 中的元素数量

javascript - 匹配括号内的所有内容

.net - StringComparison 和 StringComparer 之间转换的优雅方式?

Java将标准String转换为CP1250,每个字符只有一个字节

javascript - 如何批量删除字符串中所有不需要的字符?

java - 启动画面中的 GIF 不流畅