java正则表达式中\

1.反斜线 ‘\ ’ 转义和引用

在初期运用正则表达式的时候可能竟然因为对‘ \ ‘不理解而产生不必要的错误,这个字符在 Java 中是非常特殊的,它的作用就是转义和引用。

引用 :反斜线 用于引用其他将被解释为非转义构造的转义字符 ,这话的确很拗口,仔细分析其实是不难理解的,比如想要声明一个内容为一对英文符号的双引号的字符串,也就是 ”” ,那么如何声明呢?如果直接这样声明

String str = “”””;

编译器是肯定不通过的,因为在 Java 中双引号是转义字符,也就是说单一个双引号表示的并非其原意,那么我们如何声明呢?其实很简单只要改成这样就解决了。

String str = “\”\””;

我们要将一个双引号原本的意思表示出来使用反斜线即可,也就是说  在 JVM 中被认作为字符串的声明符号类似于操作运算符,而前面加上一个反斜线 \ 就是告诉 JVM我要双引号的文本意思(也就是上面那句话中的 解释为非转义构造 ),即一个符号。

转义 :反斜线同时也可以用于引用转义构造,举一个最简单的例子, n 原本没有任何其他意思,也就是非转义字符,而前面加上 \ ,变为 \n 就代表一个换行符,这时反斜线就把 n “转义“了,注意这里的 \n 是事先声明过的,如果来一个 \v 在编译时就会报错。在不表示转义构造的任何字母字符前使用反斜线都是错误的;它们是为将来扩展正则表达式语言保留的。可以在非字母字符前使用反斜线,不管该字符是否是非转义构造的一部分。当然如果要解释非转义的其本身,可以这样 \\


2.正则表达式中匹配一个“\”,需要在表达式中写4个"\\\\"。

因为对于编译器而言,\表示转义,并且这样的字符串必须先被编译器“阅读”一遍,例如:

"\\\\"编译器阅读后变成了"\\","\\"再由正则表达式阅读,显然正则表达式中"\\"表示\

"\\d"编译器阅读后变成了"\d","\d"再由正则表达式阅读。

3.实例

public static void main(String[] args) {
		String str="欢迎\t欢迎";
		System.out.println(str.replaceAll("\\\t",""));
		System.out.println(str.replaceAll("\\t", ""));
		System.out.println(str.replaceAll("\t", ""));
		System.out.println(str.replaceAll("\\\\t", ""));
	}

输出结果:

欢迎欢迎
欢迎欢迎
欢迎欢迎
欢迎	欢迎

看起来明显输入的正则表达式不同,但是输出结果都一样(制表符被替换)。随后去查了下Pattern的Doc,发现下面一段话:

It is an error to use a backslash prior to any alphabetic character that does not denote an escaped construct; these are reserved for future extensions to the regular-expression language. A backslash may be used prior to a non-alphabetic character regardless of whether that character is part of an unescaped construct.

其大意是,一个反斜线可以放在任何一个非字母之前而无论这个字符是否是一个可以escaped的字符。(经过测试发现,如果反斜线后面跟着一个非字母字符的时候是不起任何作用的,跟不加反斜线的效果一样)

那么回头来看这个问题,由于\在Java中是转义符,所以出现有\的地方我们先做一个转换如下,左边是原始输入,右边是转义以后的字符串数组(数组的形式更方便区分):

  • \t -> {\t}
  • \ \t -> {\,t}
  • \ \ \t -> {\, \t}
  • \ \ \ \t -> {\,\,t} (增加了这个选项以便看到输出和其他三个的区别)

第一个就是制表符,会被替换掉。 
第二个转义以后虽然不是制表符,但是从字面上看来也是制表符,所以正则替换的时候也被替换掉了。 
第三个转义以后是一个\和一个制表符,根据前面看到的JavaDoc提到的内容。制表符是一个非字母字符,所以这个用法其实就是表示一个制表符(你也可以把 \t 换成 \你 看看输出结果)。 
第四个转义以后是\,\和t三个字符,是不满足替换条件的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值