新闻资讯  快讯  焦点  财经  政策  社会
互 联 网   电商  金融  数据  计算  技巧
生活百科  科技  职场  健康  法律  汽车
手机百科  知识  软件  修理  测评  微信
软件技术  应用  系统  图像  视频  经验
硬件技术  知识  技术  测评  选购  维修
网络技术  硬件  软件  设置  安全  技术
程序开发  语言  移动  数据  开源  百科
安全防护  资讯  黑客  木马  病毒  移动
站长技术  搜索  SEO  推广  媒体  移动
财经百科  股票  知识  理财  财务  金融
教育考试  育儿  小学  高考  考研  留学
您当前的位置:首页 > IT百科 > 程序开发 > 语言 > JAVA

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

时间:2019-09-11 13:10:32  来源:  作者:

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



Tags:java   点击:()  评论:()
声明:本站部分内容来自互联网,内容观点仅代表作者本人,如有任何版权侵犯请与我们联系,我们将立即删除。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
能准确说出下面的java 执行完毕后会打印出什么?...【详细内容】
2019-09-11   java  点击:(0)  评论:(0)  加入收藏
1.List1.1 Arraylist 与 LinkedList 区别 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全; 底层数据结构: Arraylist 底层使用的是 Object 数组...【详细内容】
2019-09-11   java  点击:(3)  评论:(0)  加入收藏
下面的语句会编译报错或者打印什么? System.out.print("baidu site :"); https://www.baidu.com; System.out.println(" format");很多人会说:会编译出错,中间那行是什么鬼?...【详细内容】
2019-09-11   java  点击:(4)  评论:(0)  加入收藏
定义变量需要用关键字 &#39;var&#39; var iNum = 123; var sTr = &#39;asd&#39;; //同时定义多个变量可以用","隔开,公用一个&lsquo;var&rsquo;关键字 var iNum = 45,sTr=&#3...【详细内容】
2019-09-11   java  点击:(3)  评论:(0)  加入收藏
随机数我们应该不陌生,业务中我们用它来生成验证码,或者对重复性要求不高的id,甚至我们还用它在年会上搞抽奖。今天我们来探讨一下这个东西。如果使用不当会引发一系列问题。...【详细内容】
2019-09-11   java  点击:(3)  评论:(0)  加入收藏
关闭HDFS的权限检查设置完成重启HDFS集群查看文件 编辑后的文件 启动HDFS集群 创建maven项目,配置pom文件(核心配置代码) 1、 创建一个目录创建运行类,编写测试方法我们在集群中...【详细内容】
2019-09-11   java  点击:(4)  评论:(0)  加入收藏
下面的这断代码大家应该再熟悉不过了,线程休眠需要捕获或者抛出线程中断异常,也就是你在睡觉的时候突然有个人冲进来把你吵醒了。...【详细内容】
2019-09-10   java  点击:(5)  评论:(0)  加入收藏
异常处理是Java 开发中的一个重要部分。它是关乎每个应用的一个非功能性需求,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等。Java提供了几个异常处理特性,以t...【详细内容】
2019-09-10   java  点击:(6)  评论:(0)  加入收藏
要想理解反射的原理,首先要了解什么是类型信息。Java让我们在运行时识别对象和类的信息,主要有两种方式:一种是传统的RTTI(Run-Time Type Identification),它假定我们在编译时已...【详细内容】
2019-09-10   java  点击:(5)  评论:(0)  加入收藏
在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基于什...【详细内容】
2019-09-09   java  点击:(5)  评论:(0)  加入收藏
在开发Elasticsearch的应用过程中,需要读取索引相关的JSON Settings、Mappings设置,将JSON文档存放到项目的resources 目录,然后读取并调用Elasticsearch API 执行。 POM依赖<d...【详细内容】
2019-09-09   java  点击:(4)  评论:(0)  加入收藏
之前在实现熔断降级组件时,需要实现一个接口的超时中断,意思是,业务在使用熔断降级功能时,在平台上设置了一个超时时间,如果在请求进入熔断器开始计时,并且接口在超时时间内没有响...【详细内容】
2019-09-09   java  点击:(5)  评论:(0)  加入收藏
1.为什么使用内部类?使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响1.1.使用内部类...【详细内容】
2019-09-09   java  点击:(2)  评论:(0)  加入收藏
和往常一样,jsPDF是一个开源的客户端的PDF解决方案,在之前的文章中已经介绍过几个Web端和PDF相关的库,jsPDF同样是一个不错的客户端PDF引 SDK,你可以通过jsPDF在客户端完成相关操作,它包含了非常丰富的API,帮助你完成一系列...【详细内容】
2019-09-09   java  点击:(2)  评论:(0)  加入收藏
主要包括下面这些:数据类型、判断方法、执行上下文、变量对象、活动对象原型、原型链作用域、作用域链闭包、垃圾回收机制、this指向、类和模块、继承、函数式编程、同步异步...【详细内容】
2019-09-09   java  点击:(4)  评论:(0)  加入收藏
这篇文章关于什么?Javascript作为浏览器脚本语言,已经逐渐变得无处不在,它让你对事件驱动模型有了基本理解,以及它与request-response模型的典型语言,如Ruby,Python和Java的区别,我...【详细内容】
2019-09-06   java  点击:(9)  评论:(0)  加入收藏
NIO编程一直是Java知识体系中的一个重点。前几年的时间面试的门槛是了解NIO,现在就不一样了,最起码也要精通NIO,因此学习javaNIO编程是非常有必要的。这篇文章就开始对NIO进...【详细内容】
2019-09-05   java  点击:(11)  评论:(0)  加入收藏
此文适合零基础、初学者阅读。相信零基础的你看完,将对web前端有一个深刻的认识,对你的学习会有很大帮助。1、JavaScript 定义: javaScript的简写形式就是JS,是由Netscape公司开...【详细内容】
2019-09-04   java  点击:(9)  评论:(0)  加入收藏
java中的进制也算是面试中经常会遇到的一个知识点,不管是计算问题,还是涉及到的基础知识。因此这篇文章对其进行一个整理。主要参考了慕课网上的视频,特在此说明。不管是你初学...【详细内容】
2019-09-04   java  点击:(4)  评论:(0)  加入收藏
Java 和 C++ 都是面向对象语言。也就是说,它们都能够实现面向对象思想(封装,继乘,多态)。而由于 C++ 为了照顾大量的 C 语言使用者,而兼容了 C ,使得自身仅仅成为了带类的 C 语言...【详细内容】
2019-09-04   java  点击:(6)  评论:(0)  加入收藏
推荐资讯
相关文章
栏目更新
栏目热门