java中最容易犯错的特殊字符
问题背景
能准确说出下面的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中最容易犯错的特殊字符相关推荐
- u0027代表JAVA_java中最容易犯错的特殊字符
问题背景 能准确说出下面的java 执行完毕后会打印出什么? System.out.println( String.class.getName()+ ".class"); Syst ...
- Java线程同步容易犯错的坑
在Java开发过程中,通过线程同步机制确保线程安全,线程同步机制说起来挺简单,大家也都能说出个一二来,实际应用过程中一不小心就容易犯错,这里把自己的历程写下来作为记录,有则改之,无则加勉. 1.线程同 ...
- java中write方法报错_Java中管道报错:Write end dead
今天看了下关于管道的通信,Java中的管道只能在同一进程的不同线程间通信.今天测试两个线程进行通信发现报错.下面是我测试的代码. package com.wpl.testIO; import java ...
- [Java基础] Java中List.remove报错UnsupportedOperationException
Java中List.remove(removeRange,clear类似) 报出 UnsupportedOperationException 的错误.原来该List是一个AbstractList,不支 ...
- java中else语句有错_java 菜鸟 If else有错误
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 不多说 直接写代码 这是我全部代码 import java.io.*; import java.applet.*; import java.awt.*; ...
- java中412是什么错_HTTP 412 错误 – 先决条件失败 (Precondition failed)
HTTP 412 错误 – 先决条件失败 (Precondition failed) 介绍 您的 Web 服务器认为,该服务器检测到客户端发送的 HTTP 数据流包括一个没有满足的'先决条件'规范. ...
- 管理就是通过别人完成任务,别怕员工犯错
互联网时代,每一位知识工作者,都是管理者.领导力已不再是某些人的专属能力,而成为每一个人生存.发展所需的硬技能.领导力不是天生的基因带来的能力,而是一系列可操作.可模仿.可践行的工具:沟通视窗.目标管 ...
- JAVA产生异常并打印,Java中异常打印输出的常见方法整理
前言 Java异常是在Java应用中的警报器,在出现异常的情况下,可以帮助我们程序猿们快速定位问题的类型以及位置.但是一般在我们的项目中,由于经验阅历等多方面的原因,依然有若干的童鞋在代码中没有正确的 ...
- java 容易犯错_Java中容易犯错的题
1.运行以下程序: public static void main(String[] args) { int s = 2147483647; s+=2L; System.out.println(s); ...
最新文章
- mysql累加某字段到达临界值,获取另一个字段的值
- 用html5播放两个视频,HTML5视频 - 如何进行无缝播放和/或几个视频循环?
- 当MVP与阿里云一起踏上西行远征——阿里云MVP“戈壁之路”徒步记行
- 用c语言编程计算10,计算方法c语言编程.doc
- 新手学appium-Appium for Windows说明(中文翻译)
- JavaScript 刷题一
- 10个有用的网站访问分析工具
- Linux 常用软件分类
- Atiitt io的stream流的分类 目录 1. 流的优缺点 高性能但复杂	1 1.1. 字节数组更加简单,但性能差点	1 2. Io体系	1 2.1. 字符流 vs 字节流	2 2.2.
- 吉林大学超星MOOC学习通高级语言程序设计 C++ 实验01 顺序程序设计(2021级)
- 成功破解:世界杀软“金奖”得主BitDefender 2008(官方中文版 + 注册机下载)
- Spring(三) 表单页面处理
- python爬取阿里云漏洞库完整版
- 怎么用java做动态壁纸_开发实时壁纸
- pg、pgadmin安装指导
- 详细说明VScode设置中文,主题更改,文件图标及字体设置
- 筛选状态下进行复制粘贴为数值
- 116 Ajax简单应用
- 下血本买的!Android开发者出路在哪?先收藏了
- Win8系统hiberfil.sys是什么文件?Win8系统hiberfil.sys怎么删除?
热门文章
- c语言中当二维数组越界时会有错误提示,萌新请教大佬们。动态二维数组莫名其妙越界了,找了半天没发现有错啊...
- linux平台 一个简单的helloworld动态库的制作与使用
- Linux 内核定时器使用 二 高精度定时器 hrtimer 的用例
- java 栈队列_java 栈 队列实现
- oracle和mysql登录方式_使用普通方式和连接池方式获取Oracle和Mysql链接
- 软件商店下载java_Sun升级Java应用商店
- mysql 5.1 备份_mysql 5.1备份到5.0 USING BTREE
- 怎么制作升温曲线图_利用金字塔原理制作PPT,完整有逻辑
- 阿里云物模型层初始化代码实现
- 禄露禄露碌脛脥炉脛锚,学者批时下宫廷戏“就是一堆文化垃圾”