首页 > 编程语言 >【Java】split(

【Java】split(

时间:2022-11-11 12:07:24浏览次数:51  
标签:java 正则表达式 转义 一个 split 斜杠 字符串 Java


java 的split函数接受一个正则表达式的分隔符为参数,将string按照分隔符划分为一个数组。我们可能会忽略这个参数的要求,这里传入的分隔符并不是一个普通的字符串,而是一个正则表达式。

最常见的情景,比如“a.b”,分割为“a”和“b”,如果我们不注意,会写成s.split("."),结果是不对的,因为"."是被当做一个正则表达式来看的,它有特殊含义,表示“任意单个字符”,所以结果肯定不是我们想要的。事实上最后会返回空,不知道为什么。。。

接着上网一查,发现了需要转义,也就是“\\.”,结果果然是对的。

这里我想搞清楚为什么是两个斜杠。

需要明白两点。

第一,在java的字符串中,反斜杠是由特殊含义的,它的存在只是为了表明它后面的一个字符需要做特殊处理而非原本的意思。比如“\n”是换行。如果我们要使用反斜杠本来的含义呢?需要用两个反斜杠。而且,反斜杠不是随便可以使用的,只能用在六种情况下,即只能对六种字符转义,不能单独出现或者转义其他字符。

比如定义了

String s  = "\y";

就会提示编译错误:“  

Invalid escape sequence (valid ones are  \b  \t  \n  \f  \r  \"  \'  \\ ”,说明反斜杠只能在这六种情况下转义。

这是java字符串层面上的反斜杠。

第二,在正则表达式里。反斜杠也有特殊含义,正则表达式有一套自己的规定,这个规定是脱离语言层面的。比如“*”表示重复任意次。“\d”表示一个数字等。我们想在java里面写出一个正则字符串,可能需要用到反斜杠,这时就需要注意java语言里的string对反斜杠的特殊限制,也就是第一点。

我们想定义一个“\d”,就需要在“d”前面加一个反斜杠,但是一个反斜杠在java里会被当做转义符,所以我们需要再加一个反斜杠。第一个是正则表达式的要求,第二个是java语言里的要求。

有人会问,既然一个反斜杠就是转义符,那么为什么“\d”没有把“d”转义成功呢?因为,在java语言里面,反斜杠只能转义前面提到的六种字符,这里的“\d”是正则表达式的规定,并不是java语言的规定,java语言内部是不知道“\d”也需要转义,不知道这是一个正则表达式,他只知道这个是一个字符串。只要我们程序的编写者或者说正则表达式的类库编写者和使用者,才会把这个字符串当做一个正则表达式来看。

所以,为什么会有两个反斜杠是因为它们代表了来两个层面的含义,一个是java语言的转义符,一个是正则表达式的规定。


标签:java,正则表达式,转义,一个,split,斜杠,字符串,Java
From: https://blog.51cto.com/u_15873544/5844093

相关文章

  • 【Java】多线程 数目
    今天看到一篇文章,讲多线程数目的,很棒这个问题还是很容易被忽略的,就是多线程到底是为了什么?最开始学习多线程的时候,往往将多线程和性能高划等号,只要用了多线程就能提升性能,其......
  • 【Java】NoSuchMethodError
    刚开始写代码时,特别是类似web这种需要很多第三方jar包的项目,经常会遇到这个问题。这次记录下这个报错的原因。简而言之,这个报错是肯定是因为compile时方法存在,但是runtime时......
  • 【Java】反射与单例
    双重检验与静态内部类两种方法都可以实现延迟加载的单例模式。但是无法阻止反射破坏单例,因为反射可以无视修饰权限,直接调用构造方法创建对象,下面是一个例子:packageThreadTe......
  • 【Java】序列化与单例
    之前明白了线程安全且延迟加载的单例如何写,有两种,双重检验和静态内部类。然后为了防止反射破坏单例,在私有构造方法里面加入了一个同步变量的判断,确保构造方法只调用一次。......
  • 【Java】HashMap 实现原理
    Java集合框架有两个顶级接口,一个是collection接口,另一个是map接口,hashmap便是map接口的重要实现类。首先看map接口。根据map键值对的特性,接口中必然有相关的方法,主要是:Vget......
  • 【Java】concurrentHashMap
    concurrentHashMap类引入了段的概念,读操作不需要上锁,写操作只需要获取相应的段的锁即可,而非锁定全部的数据。所以map里面是一个segment的数组,segment里面才是entry的数组。m......
  • 【Java】Map 实现类
    hashmap:遍历时顺序无法保证linkedhashmap:遍历时按照插入顺序treemap:遍历时按照大小顺序linkedhashmap实现上是继承了hashmap,多了一个双向的链表记录插入顺序,重写了迭代器,基......
  • 【Java】 Set实现类
    Set是collection的子接口,对应数学中的集合。与list的最主要的区别是,set无法通过索引取值,因为set是无序的。set还有一个特性是唯一性,不能存相同的元素。第一个实现类是hashse......
  • 【Java】垃圾回收机制 GC
    GC是java中比较有特色的技术,减轻了程序员的负担。当然也是面试中的高频话题。对于垃圾回收,首先要解决的是找出哪些对象是需要回收的。第一个方法是计算引用数目,实现比较简单......
  • springboot 引入外部包的坑Lookup method resolution failed; nested exception is ja
    手动引入jar包<dependency><groupId>com.allinpay.sdk</groupId><artifactId>top-sdk-java</artifactId><version>1.0.5</......