问题背景

能准确说出下面的java 执行完毕后会打印出什么?

        System.out.println(String.class.getName()+ ".class");System.out.println(String.class.getName().replaceAll(".","/") + ".class");

相信对于第一行,大部分人不会犯错,打印

java.lang.String.class

我们想使用/去分割类的包,期待打印的结果为

java/lang/String/class

真实返回的结果是这个样子的:

.class

为什么会这样呢

 原因

  问题在于String.replaceAll 接受了一个正则表达式作为它的第一个参数,而并

非接受了一个字符序列字面常量。(正则表达式已经被添加到了Java 平台的1.4

版本中。)正则表达式“.”可以匹配任何单个的字符,因此,类名中的每一个

字符都被替换成了一个斜杠,进而产生了我们看到的输出。

解决方式

方式一:使用转义字符

        System.out.println(String.class.getName().replaceAll("\\.","/") + ".class");    

打印结果

java/lang/String.class

是不是有点不懂,为什么会有两个?

第一个"\"代表的是引用(正则表达式中的Quotation),第二个代码"\"转义

Quotation \   Nothing, but quotes the following character \Q    Nothing, but quotes all characters until \E \E    Nothing, but ends quoting started by \Q

方式二 使用Quotation

        System.out.println(String.class.getName().replaceAll("\\Q.\\E","/") + ".class");    

结果也是

java/lang/String.class

也可以使用

        System.out.println(String.class.getName().replaceAll(Pattern.quote("."),"/") + ".class");    

其内部实现也是使用Quotation

 /*** Returns a literal pattern <code>String</code> for the specified* <code>String</code>.** <p>This method produces a <code>String</code> that can be used to* create a <code>Pattern</code> that would match the string* <code>s</code> as if it were a literal pattern.</p> Metacharacters* or escape sequences in the input sequence will be given no special* meaning.** @param s The string to be literalized* @return A literal string replacement* @since 1.5*/public static String quote(String s) {int slashEIndex = s.indexOf("\\E");if (slashEIndex == -1)return "\\Q" + s + "\\E";StringBuilder sb = new StringBuilder(s.length() * 2);sb.append("\\Q");slashEIndex = 0;int current = 0;while ((slashEIndex = s.indexOf("\\E", current)) != -1) {sb.append(s.substring(current, slashEIndex));current = slashEIndex + 2;sb.append("\\E\\\\E\\Q");}sb.append(s.substring(current, s.length()));sb.append("\\E");return sb.toString();}

常见的特殊字符有:

EscapeSequence:\ b (backspace BS, Unicode \\u0008)\ t (horizontal tab HT, Unicode \\u0009)\ n (linefeed LF, Unicode \\u000a)\ f (form feed FF, Unicode \\u000c)\ r (carriage return CR, Unicode \\u000d)\ " (double quote ", Unicode \\u0022)\ ' (single quote ', Unicode \\u0027)\ \ (backslash \, Unicode \\u005c)OctalEscape (octal value, Unicode \\u0000 to \\u00ff)

还有

Twelve tokens, formed from ASCII characters, are the separators (punctuators).

( ) { } [ ] ; , . ... @ ::

也可以使用下面的方法进行判断

import java.util.regex.Matcher;
import java.util.regex.Pattern;public class CheckSpecialCharacterString {/*** Check whether the each character of String is special character or not using java* @author www.instanceofjava.com*/public static void main(String[] args) {
String Str="Java String interview questions*$%";String specialCharacters=" !#$%&'()*+,-./:;<=>?@[]^_`{|}";for (int i = 0; i < Str.length(); i++) {if (specialCharacters.contains(Character.toString(Str.charAt(i)))){System.out.println(Str.charAt(i)+": is a special character");} }}}

更详细的资料可以参考官方文档【3】

参考资料:

【1】java解惑

【2】https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

【3】https://docs.oracle.com/javase/specs/jls/se12/html/jls-3.html#jls-3.10.6

【4】http://www.instanceofjava.com/2017/05/how-to-check-if-character-is-special.html

转载于:https://www.cnblogs.com/davidwang456/p/11511209.html

java中最容易犯错的特殊字符相关推荐

  1. u0027代表JAVA_java中最容易犯错的特殊字符

    问题背景 能准确说出下面的java 执行完毕后会打印出什么? System.out.println( String.class.getName()+ ".class"); Syst ...

  2. Java线程同步容易犯错的坑

    在Java开发过程中,通过线程同步机制确保线程安全,线程同步机制说起来挺简单,大家也都能说出个一二来,实际应用过程中一不小心就容易犯错,这里把自己的历程写下来作为记录,有则改之,无则加勉. 1.线程同 ...

  3. java中write方法报错_Java中管道报错:Write end dead

    今天看了下关于管道的通信,Java中的管道只能在同一进程的不同线程间通信.今天测试两个线程进行通信发现报错.下面是我测试的代码. package com.wpl.testIO; import java ...

  4. [Java基础] Java中List.remove报错UnsupportedOperationException

    Java中List.remove(removeRange,clear类似) 报出 UnsupportedOperationException 的错误.原来该List是一个AbstractList,不支 ...

  5. java中else语句有错_java 菜鸟 If else有错误

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 不多说 直接写代码 这是我全部代码 import java.io.*; import java.applet.*; import java.awt.*; ...

  6. java中412是什么错_HTTP 412 错误 – 先决条件失败 (Precondition failed)

    HTTP 412 错误 – 先决条件失败 (Precondition failed) 介绍 您的 Web 服务器认为,该服务器检测到客户端发送的 HTTP 数据流包括一个没有满足的'先决条件'规范. ...

  7. 管理就是通过别人完成任务,别怕员工犯错

    互联网时代,每一位知识工作者,都是管理者.领导力已不再是某些人的专属能力,而成为每一个人生存.发展所需的硬技能.领导力不是天生的基因带来的能力,而是一系列可操作.可模仿.可践行的工具:沟通视窗.目标管 ...

  8. JAVA产生异常并打印,Java中异常打印输出的常见方法整理

    前言 Java异常是在Java应用中的警报器,在出现异常的情况下,可以帮助我们程序猿们快速定位问题的类型以及位置.但是一般在我们的项目中,由于经验阅历等多方面的原因,依然有若干的童鞋在代码中没有正确的 ...

  9. java 容易犯错_Java中容易犯错的题

    1.运行以下程序: public static void main(String[] args) { int s = 2147483647; s+=2L; System.out.println(s); ...

最新文章

  1. mysql累加某字段到达临界值,获取另一个字段的值
  2. 用html5播放两个视频,HTML5视频 - 如何进行无缝播放和/或几个视频循环?
  3. 当MVP与阿里云一起踏上西行远征——阿里云MVP“戈壁之路”徒步记行
  4. 用c语言编程计算10,计算方法c语言编程.doc
  5. 新手学appium-Appium for Windows说明(中文翻译)
  6. JavaScript 刷题一
  7. 10个有用的网站访问分析工具
  8. Linux 常用软件分类
  9. Atiitt io的stream流的分类 目录 1. 流的优缺点 高性能但复杂 1 1.1. 字节数组更加简单,但性能差点 1 2. Io体系 1 2.1. 字符流 vs 字节流 2 2.2.
  10. 吉林大学超星MOOC学习通高级语言程序设计 C++ 实验01 顺序程序设计(2021级)
  11. 成功破解:世界杀软“金奖”得主BitDefender 2008(官方中文版 + 注册机下载)
  12. Spring(三) 表单页面处理
  13. python爬取阿里云漏洞库完整版
  14. 怎么用java做动态壁纸_开发实时壁纸
  15. pg、pgadmin安装指导
  16. 详细说明VScode设置中文,主题更改,文件图标及字体设置
  17. 筛选状态下进行复制粘贴为数值
  18. 116 Ajax简单应用
  19. 下血本买的!Android开发者出路在哪?先收藏了
  20. Win8系统hiberfil.sys是什么文件?Win8系统hiberfil.sys怎么删除?

热门文章

  1. c语言中当二维数组越界时会有错误提示,萌新请教大佬们。动态二维数组莫名其妙越界了,找了半天没发现有错啊...
  2. linux平台 一个简单的helloworld动态库的制作与使用
  3. Linux 内核定时器使用 二 高精度定时器 hrtimer 的用例
  4. java 栈队列_java 栈 队列实现
  5. oracle和mysql登录方式_使用普通方式和连接池方式获取Oracle和Mysql链接
  6. 软件商店下载java_Sun升级Java应用商店
  7. mysql 5.1 备份_mysql 5.1备份到5.0 USING BTREE
  8. 怎么制作升温曲线图_利用金字塔原理制作PPT,完整有逻辑
  9. 阿里云物模型层初始化代码实现
  10. 禄露禄露碌脛脥炉脛锚,学者批时下宫廷戏“就是一堆文化垃圾”