• 【无标题】


    关于\n,\\n,\\\n在java中的split()正则中的理解

    在做一个题的时候, 要把一串字符串dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext按\n分割

    粘贴到idea, idea识别自动转义成(也是一个坑): "dir\\n\\tsubdir1\\n\\tsubdir2\\n\\t\\tfile.ext"

    但是我用

    str.split("\n")
    
    str.split("\\\n")
    
    str.split("\\\\\n")
    
    • 1
    • 2
    • 3
    • 4
    • 5

    都没有获取到,str.split(“\\\\n”)才获取到了

    java的编译和正则的解析

    首先斜杆的特性

    • \单个斜杆, 会被视为转义字符

    • \n单个斜杆加特点字符, 视为一个字符

    • \\两个斜杆在一起, 会视为一个普通的斜杆,无转义效果

    其实很多斜杠搞得人云里雾里的关键, 是忽略了个问题: jvm会编译识别一次, 正则解析的时候会识别第二次.

    首先看看我们敲得字符串比如4个斜杆a\\\\n, 到正则解析的过程(为了方便解释,转义后的普通斜杆用中划线代替):

    编辑器里: a\\\\n ----> 程序运行: a--n ----> 正则识别到--\\, 同样变成普通斜杆-: a-n,即a\n

    回过头在看上面的问题,编辑器帮我转义后文本是这样"dir\\n\\tsubdir1\\n\\tsubdir2\\n\\t\\tfile.ext", 进入jvm后字符串变"dir-n-tsubdir1-n-tsubdir2-n-t-tfile.ext(-表示普通的斜杆), 自然也就是四个斜杠才能split了

    代码测试

    这里split用Pattern.compile是一样的, split方法里面有一些优化, 对一些regex进行了处理

        @Test
        public void fun01(){
          String str = "a\nbb\\nccc\\\ndddd\\\\neeee";
    
            System.out.println("str = " + str);
            
           /*
            print打印结果: 其实这个字符串是有换行的
            a
            bb\ccc\
            dddd\\neeee
             */
            String[] ss = str.split("\n");  //["a", "bb\nccc\", "dddd\\neeee"]
            String[] ss1 = str.split("\\n");  //["a", "bb\nccc\", "dddd\\neeee"]
            String[] ss2 = str.split("\\\n");  //["a", "bb\nccc\", "dddd\\neeee"]
            String[] ss3 = str.split("\\\\n");  //["a\nbb", "ccc\\ndddd\", "eeee"]
    
            String str1 = "\\nada";
            System.out.println(str1.startsWith("\n")); //F
            System.out.println(str1.startsWith("\\n")); //T
            System.out.println(str1.startsWith("\\\n")); //F
            System.out.println(str1.startsWith("\\\\n")); //F
    
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    分别解释下4个split:

    为了方便理解, 用-表示普通斜杆,用@表示换行符\n

    首先看看str, 单个\n,进入jvm识别成单个回车字符@, \\n进入jvm识别成-n,\\\n识别成-@, \\\\n识别成--n. 注意这里只是说jvm后的字符串. 最后文本在jvm中是:

    a@bb-nccc-@dddd--neeee

    1. 第一个, 正则解析为@, 和@的文本匹配切割

    2. 正则解析-n@, 匹配和第一个一样

    3. 正则解析-@,即\回车, 正则无视第一个斜杆, 并且编译器提示remove redundant escape, 因此对于正则来说, 给我一个斜杆+回车, 无法组成一个正则表达式, 所以无视第一个斜杆, 结果和第一个一样

    4. 正则解析--n-n, 和\\n的文本匹配切割

    顺便说下, startWith, 只收到jvm编译的转义影响, 不受转义的影响

  • 相关阅读:
    【 SuperPoint 】图像特征提取上的对比实验
    数据分析与应用:微信-情人节红包流向探索分析
    如何在 Spring Boot 中提高应用程序的安全性
    机器学习笔记之线性分类——逻辑回归
    【云开发】在 React Native 中使用 AWS Textract 实现文本提取
    移动安全测试框架-MobSF WINDOWS 环境搭建
    STL关联式容器set,multiset,pair,map
    mysql服务器参数设置
    安卓毕业设计选题基于Uniapp实现的鲜花购物商城
    Spring Cloud和Kubernetes + Spring Boot 用哪个?
  • 原文地址:https://blog.csdn.net/zzzgd_666/article/details/126065012