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

2023-10-26

关于\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")

都没有获取到,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

    }

分别解释下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编译的转义影响, 不受转义的影响

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • VOSviewer 操作指南 简明

    VOSviewer 操作指南 Vosviewer 软件是一种知识图谱可视化软件 并且可以使用基本的分类聚类方法 帮助我们得到进一步的信息 下载地址 https www vosviewer com download 解压完成后 你得到因该是一
  • 27 个为什么,帮助你更好的理解Python

    选自 Python官方文档 https docs python org zh cn 3 7 faq design html
  • pytorch报错:RuntimeError: CUDA error: device-side assert triggered究极解决方案

    原因 模型的数据处理出了问题 一般是类似于数组访问越界的问题 1 例如分类的标签是数据处理的时候是1 10 但是torch在计算交叉熵是默认是0 9 2 embedding模块的词表长度问题 比如embedding中词表总长度是100 但是
  • Unix时间与Win32 FileTime时间

    Unix 时间 1970 01 01 00 00 00 与 Win32 FileTime 时间 1601 01 01 00 00 00 两者相差毫秒数为 11644473600000L Win32 FileTime 采用 100ns 为单位
  • Postgres安装

    准备工作 1 查看自己的电脑是多少位 cmd界面中输入 systeminfo 按回车 主要是看一下系统类型 系统类型 64 位操作系统 基于 x64 的处理器 版本 Windows 10 专业版 版本号 20H2 安装日期 2021 10
  • 【IDEA】idea 调试技巧 查看字段 什么时候修改的

    文章目录 1 概述 1 概述 如果你阅读源码 你一定会有个困扰 类中的某个字段的值到底是在哪里改变的 你要一点点追踪调用栈 逐步排查 稍不留神 就可能有遗漏 我们可以在 IntelliJ IDEA 中为某个字段添加断点 当字段值有修改时 自
  • es--基础--06--es集群

    es 基础 06 es集群 1 集群概念 概念看es入门学习3 理论 2 集群的搭建 利用原有的单机 elasticsearch 5 6 8 来搭建 搭建三台es服务器 分别提供的端口是9201 9202 9203 2 1 停止elasti
  • 特征选择策略:为检测乳腺癌生物标志物寻找新出口

    内容一览 microRNA 小分子核糖核酸 是一类短小的单链非编码 RNA 转录体 这些分子在多种恶性肿瘤中呈现失控性生长 因此近年来被诸多研究确定为确诊癌症的可靠的生物标志物 biomarker 在多种病理分析中 差异表达分析 Diffe
  • 解决Dropbox国内无法实时更新的问题

    Dropbox软件需要在全局模式下才能时时同步 但全局模式下无法打开某些国内网站 所以需要解决该问题 解决方法 通过设置代理的方式让Dropbox软件自动同步 但在尝试中 设置为socks5代理发现不能使用 改为http代理 马上生效 打开
  • 十分钟带你走进Hive世界(每走一步都是为了离你更近些)

    该文章已更新到语雀中 后台回复 语雀 可获取进击吧大数据整个职业生涯持续更新的所有资料 该文基于Hive专题 从SQL聊Hive底层执行原理进一步的深入学习Hive 相信大多数童鞋对于Hive底层的执行流程只是局限于理论层面 那么本篇将带大
  • Windows平台Unity3d下如何同时播放多路RTSP或RTMP流

    好多开发者在做AR VR或者教育类产品时 苦于如何在windows平台构建一个稳定且低延迟的RTSP或者RTMP播放器 如果基于Unity3d完全重新开发一个播放器 代价大 而且周期长 不适合快速出产品 我们认为当前最好的方式就是集成现有N
  • 【计算机网络】 TCP——四次挥手

    文章目录 流程 考点 流程 主动方打算关闭连接 此时会发送一个TCP首部FIN标志位被置为1的报文 也即FIN报文 之后主动方进入FIN WAIT 1状态 被动方收到该报文后 就向主动方发送ACK应答报文 接着被动方进入CLOSE WAIT
  • Qt 6.4.2在Windows上安装过程及简单验证

    Qt是一个跨平台的C 开发库 用来开发图形用户界面 Graphical User Interface GUI 它支持Windows Linux macOS Android iOS QNX等平台 一个框架 一套代码库 任意平台部署 Qt有开源
  • Centos 8上安装Docker配置国内镜像源

    一 使用背景 在阿里云上安装docker后 如果采用国外的源地址 pull的时候 速度慢到让人崩溃 二 国内常用加速地址 Docker中国官方加速地址 https registry docker cn com 网易163镜像加速 http
  • 使用 Waffle 进行测试的基本流程及使用方法-文章来自问我社区

    前言 Waffle 是一款适配 ehter js 的智能合约测试库 本样例演示了使用 Waffle 进行测试的基本流程及使用方法 Waffle 详细使用方法可以参考 Waffle 官网 对于不熟悉 Waffle 测试框架的开发者 可以根据本
  • 腾讯Cos对象储存api用法教程中英图文讲解

    Chinar blog www chinar xin 腾讯云 Cos api sdk详解 本文提供全流程 中文翻译 Chinar 的初衷是将一种简单的生活方式带给世人 使有限时间 具备无限可能 Chinar 心分享 心创新 助力快速理解 C
  • Egg简介

    Egg 前言 Egg js 为企业级框架和应用而生 基于Koa开发封装 性能优异 内置多进程管理 具有高扩展性 且提供了基于Egg定制上层框架的能力 帮助开发团队降低了开发维护成本 约定先于配置 相较于express更加灵活可配 Koa K
  • gateway网关的使用

    今天与大家分享gateway网关的使用 1 gateway简介 1 1 是什么 SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关 目标是替代 Zuul 在Spring Cloud 2 0以上版本中 没
  • 动手实验:使用 jstat 摸清线上系统的JVM运行状况

    添加VX ruyuan0220 回复 CSDN 领取更多精品学习资料 目录 功能强大的jstat jstat gc PID 其他的jstat命令 到底该如何使用jstat工具 新生代对象增长的速率 Young GC的触发频率和每次耗时 每次
  • 关于\n,\\\n,\\\\\n在java中的split()正则中的理解

    关于 n n n在java中的split 正则中的理解 在做一个题的时候 要把一串字符串dir n tsubdir1 n tsubdir2 n t tfile ext按 n分割 粘贴到idea idea识别自动转义成 也是一个坑 dir n