问题背景

能准确说出下面的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

\QNothing, but quotes all characters until \E

\ENothing, 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 String for the specified

* String.

*

*

This method produces a String that can be used to

* create a Pattern that would match the string

* s as if it were a literal pattern.

Metacharacters

* or escape sequences in the input sequence will be given no special

* meaning.

*

*@params The string to be literalized

*@returnA literal string replacement

*@since1.5*/

public staticString 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");returnsb.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).

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

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

importjava.util.regex.Matcher;importjava.util.regex.Pattern;public classCheckSpecialCharacterString {/*** Check whether the each character of String is special character or not using java

*@authorwww.instanceofjava.com*/

public static voidmain(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

u0027代表JAVA_java中最容易犯错的特殊字符相关推荐

  1. java中最容易犯错的特殊字符

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

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

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

  3. 《统计会犯错——如何避免数据分析中的统计陷阱》—第2章膨胀的真理

    本节书摘来自异步社区<统计会犯错--如何避免数据分析中的统计陷阱>一书中的第2章膨胀的真理,作者[美]Alex Reinhart(亚历克斯·莱因哈特),更多章节内容可以访问云栖社区&quo ...

  4. 《统计会犯错——如何避免数据分析中的统计陷阱》—第2章置信区间的优势

    本节书摘来自异步社区<统计会犯错--如何避免数据分析中的统计陷阱>一书中的第2章置信区间的优势,作者[美]Alex Reinhart(亚历克斯·莱因哈特),更多章节内容可以访问云栖社区&q ...

  5. 沉默不是代表我的错 ---犯错

    下载地址: http://vbcoder.qupan.com/4354065.html http://www.qupan.com/down/vbcoder_4354065.html 沉默不是代表我的错 ...

  6. 软件构造-犯错的艺术——健壮性与正确性,异常,防御式编程,debugging与test的思考与总结...

    健壮性与正确性 健壮性与正确性是不同的--一个倾向于使程序尽可能保持运行,即使遇到错误,一个倾向于使程序尽可能正确,不在意保持运行 异常 异常分为两种--checked exception与unche ...

  7. 脑洞大开!拿Transformer和CNN比较!犯错都像人类

    点上方计算机视觉联盟获取更多干货 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:量子位 AI博士笔记系列推荐 周志华<机器学习>手推笔记正式开源!可打印版本附pdf下载链接 这是 ...

  8. 大数据分析常见的犯错问题

    我们会发生各种极有可能出现的混淆,数据抽取之后"迷恋"于数字,脑子里没有分析的目标,自己的局限影响指标选择......当分析数据的时候我们都很容易犯错.而今天我们就一起来了解一下, ...

  9. 《黑匣子思维:我们如何更理性地犯错》iphone部分

    笔记摘自 黑匣子思维:我们如何更理性地犯错 [英] 马修·萨伊德 2017年10月10日 第 1 章 一台常规手术 当我们再退后一步,全面考虑错误发生的原因时,会发现极具讽刺性的事实.研究表明,我们常 ...

最新文章

  1. 我看.Net My Services
  2. sklearn LDA降维算法
  3. 网工路由基础(4)EIGRP协议
  4. (3.2)将分词和去停用词后的评论文本基于“环境、卫生、价格、服务”分类...
  5. flink启动出现java.lang.NoClassDefFoundError: org/apache/hadoop/fs/Path
  6. 深入浅出Nintex——更新PeopleandGroup类型的Field
  7. typecho插件库 TeStore 方便监控插件版本
  8. 2.4 表单数据的验证
  9. 通过TextWatcher去观察输入框中输入的内容以及输入字符个数
  10. iOS开发过程中常见错误问题及解决方案
  11. 用jsp代码完成购物车并且实现添加功能
  12. 计算机自动关机原理,电脑自动关机是什么原因怎样处理
  13. ketchup 消息队列rabbitmq使用
  14. 简单计算机java程序_JAVA程序员需要知道的计算机底层基础10-操作系统引导程序的简单...
  15. 手写基于redis实现分布式限流器-pdlr
  16. 人类为什么不再登月了?
  17. echarts柱状图实现正负值不同颜色在上方显示数值
  18. datagrip 导出数据库表结构
  19. 爬虫快速入门——Request对象的使用
  20. Code Clinic: Go 代码诊所:Go语言 Lynda课程中文字幕

热门文章

  1. 微信小程序开发中,onLoad() 和onShow()的区别
  2. python画棒棒糖程序_论文画图神器!25个常用Matplotlib图的Python代码,收藏收藏!...
  3. 文本文件转换成Excel
  4. 设计模式(20):创建型-抽象工厂模式(Abstract Factory)
  5. 计算机毕业设计Node.js+Vue医疗器械公司公告管理系统(程序+源码+LW+部署)
  6. 国网×弘玑 | RPA培训课程提升员工数字素养
  7. 3.无霍尔传感器的BLDC换向原理
  8. Smart Home,让黑客攻击更加Smart
  9. Hello MySQL(九)——视图
  10. Linux串口驱动阅读笔记