java中regex_Java 9中的新Regex功能

java中regex

最近,我收到了Packt出版的Anubhava Srivastava提供的免费书籍“ Java 9 Regular Expressions” 。 这本书是一个很好的教程,它向想要学习正则表达式并从头开始的任何人介绍。 那些知道如何使用正则表达式的人可能仍然很有趣,以重申其知识并加深诸如零长度断言,反向引用之类的复杂特征。

在本文中,我将重点介绍特定于Java 9且在早期版本的JDK中不可用的正则表达式功能。 但是,数量并不多。

Java 9正则表达式模块

Java 9中的JDK分为多个模块。 可以理所当然地期望为正则表达式处理包和类提供一个新模块。 其实没有。 模块java.base是默认模块,默认情况下所有其他模块都依赖该模块,因此,导出的包的类在Java应用程序中始终可用。 此模块导出正则表达式包java.util.regex 。 这使开发过程更加简单:如果我们想在代码中使用正则表达式,则无需显式地“要求”模块。 似乎正则表达式对于Java是如此重要,以至于它包含在基本模块中。

正则表达式类

java.util.regex包含这些类

  • MatchResult
  • Matcher
  • Pattern
  • PatternSyntaxException

更改API的唯一类是Matcher

类匹配器的变化

Matcher类添加了五个新方法。 其中四个是现有方法的重载版本。 这些是:

  • appendReplacement
  • appendTail​
  • replaceAll​
  • replaceFirst​
  • results​

前四个存在于较早的版本中,并且参数的类型仅发生变化(毕竟这就是重载的意思)。

appendReplacement / Tail

对于appendReplacementappendTail ,唯一的区别是该参数还可以是StringBuilder ,而不仅是StringBuffer 。 考虑到StringBuilder是Java 1.5中引入的,就像13年前一样,没有人可以说这是一个不明智的行为。

有趣的是,API JDK的当前在线版本如何记录StringBuilder参数的appendReplacement行为。 较旧的StringBuffer变量方法显式记录了替换字符串可能包含将由相应组替换的命名引用。 StringBuilder争论的版本错过了这一点。 该文档似乎像复制/粘贴然后进行编辑。 文本将“ buffer”替换为“ builder”等,并删除记录命名参考功能的文本。

我使用Java 9 build160尝试了该功能,对于这两个方法版本,结果是相同的。 这并不奇怪,因为这两种方法的源代码是相同的,除了参数类型之外,在JDK中都是简单的复制/粘贴。

似乎可以使用

@Testpublic void testAppendReplacement() {Pattern p = Pattern.compile("cat(?<plural>z?s?)");//Pattern p = Pattern.compile("cat(z?s?)");Matcher m = p.matcher("one catz two cats in the yard");StringBuilder sb = new StringBuilder();while (m.find()) {m.appendReplacement(sb, "dog${plural}");//m.appendReplacement(sb, "dog$001");}m.appendTail(sb);String result = sb.toString();assertEquals("one dogz two dogs in the yard", result);}

注释行或每行上方的行。 但是,文档仅涉及编号的参考。

replaceAll / First

这也是一种“旧的”方法,用一些新的字符串替换匹配的组。 旧版本和新版本之间的唯一区别是替换字符串的提供方式。 在老版本的字符串被赋予作为String调用方法之前计算。 在新版本中,字符串作为Function<MatchResult,String> 。 每个匹配结果都会调用此函数,并且可以动态计算替换字符串。

知道Function类是3年前才在Java 8中引入的,因此在正则表达式中对它的新使用可能有点破绽。 或者,也许……也许我们应该将其视为一个提示,即从现在开始十年,当Fuction类已经13岁时,我们仍然会有Java 9?

让我们更深入地研究这两种方法。 (实际上只用于replaceAll因为replaceFirst相同,只不过它只替换第一个匹配的组。)当这样的使用有价值时,我尝试创建一些并非绝对复杂的示例。

第一个示例来自JDK文档:

@Testpublic void demoReplaceAllFunction() {Pattern pattern = Pattern.compile("dog");Matcher matcher = pattern.matcher("zzzdogzzzdogzzz");String result = matcher.replaceAll(mr -> mr.group().toUpperCase());assertEquals("zzzDOGzzzDOGzzz", result);}

它不太复杂,并显示了功能。 使用lambda表达式绝对足够。 我无法想象一种简单的方法将常量字符串文字“ dog”大写。 也许只写“ DOG”。 好吧,我只是在开玩笑。 但是实际上这个例子太简单了。 对于文档来说是可以的,更复杂的事情会使读者分心于所记录方法的功能。 确实:不要期望JavaDoc中的复杂示例更少。 它描述了如何使用API​​,而不是描述了为什么以这种方式创建API。

但是现在我们现在将看一些更复杂的例子。 我们要在字符串中用数字1、2、3等替换#字符。 该字符串包含编号的项目,如果我们在该字符串中插入了一个新项目,我们不想手动重新编号。 有时我们将两个项目组合在一起,在这种情况下,我们编写## ,然后只想跳过下一个#的序列号。 由于我们已经进行了单元测试,因此代码比我可以用语言更好地描述了功能:

@Testpublic void countSampleReplaceAllFunction() {AtomicInteger counter = new AtomicInteger(0);Pattern pattern = Pattern.compile("#+");Matcher matcher = pattern.matcher("# first item\n" +"# second item\n" +"## third and fourth\n" +"## item 5 and 6\n" +"# item 7");String result = matcher.replaceAll(mr -> "" + counter.addAndGet(mr.group().length()));assertEquals("1 first item\n" +"2 second item\n" +"4 third and fourth\n" +"6 item 5 and 6\n" +"7 item 7", result);}

传递给replaceAll的lambda表达式获取计数器并计算下一个值。 如果我们使用一个#那么如果我们使用两个,它将增加1,然后将其添加到计数器,依此类推。 因为lambda表达式不能在周围环境中更改变量的值(变量必须有效地为final),所以计数器不能为intInteger变量。 我们需要一个具有int值并且可以更改的对象。 AtomicInteger就是即使我们不使用它的原子功能也是如此。

下一个示例更进一步,并进行了一些数学计算。 它将字符串中的任何浮点格式的数字替换为其正弦值。 这样,由于sin(pi)甚至不接近pi,因此它可以纠正我们的句子,此处无法精确表示。 它几乎接近零:

@Testpublic void calculateSampleReplaceAllFunction() {Pattern pattern = Pattern.compile("\\d+(?:\\.\\d+)?(?:[Ee][+-]?\\d{1,2})?");Matcher matcher = pattern.matcher("The sin(pi) is 3.1415926");String result = matcher.replaceAll(mr -> "" + (Math.sin(Double.parseDouble(mr.group()))));assertEquals("The sin(pi) is 5.3589793170057245E-8", result);}

我们还将对此计算进行一些操作,以演示列表中的最后一个方法,它是Matcher类中的一个全新方法。

流结果()

新方法results()返回匹配结果流。 更精确地说,它返回MatchResult对象的Stream 。 在下面的示例中,我们使用它从字符串中收集任何浮点格式的数字,并以逗号分隔打印其正弦值:

@Testpublic void resultsTest() {Pattern pattern = Pattern.compile("\\d+(?:\\.\\d+)?(?:[Ee][+-]?\\d{1,2})?");Matcher matcher = pattern.matcher("Pi is around 3.1415926 and not 3.2 even in Indiana");String result = String.join(",",matcher.results().map(mr -> "" + (Math.sin(Double.parseDouble(mr.group())))).collect(Collectors.toList()));assertEquals("5.3589793170057245E-8,-0.058374143427580086", result);}

摘要

Java 9 JDK中引入的新正则表达式方法与现有的方法没有本质上的区别。 它们整洁方便,在某些情况下可以简化编程。 没有早期版本中不会引入的任何内容。 这只是Java缓慢而深思熟虑地对JDK进行此类更改的方式。 毕竟,这就是为什么我们喜欢Java,不是吗?

您可以从以下要点找到并下载IDE中的整个代码副本粘贴

翻译自: https://www.javacodegeeks.com/2017/08/new-regex-features-java-9.html

java中regex

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何将本地 Windows 电脑中的文件复制(上传)到远程的 Windows 服务器主机上

文章目录第一步&#xff1a;点击「远程桌面连接」第二步&#xff1a;输入远程主机 IP 和 port第三步&#xff1a;设置本地目录共享第四步&#xff1a;点击「连接」按钮&#xff0c;输入登录用户名和密码第五步&#xff1a;复制本地文件到远程主机上第一步&#xff1a;点击「远程…

股票实例_注意了!手中的股票涨停,但是却封不住反复打开,说明了什么?看懂持股不慌...

手中的股票涨停&#xff0c;却封不住反复打开&#xff0c;说明了什么?如果一只股票收到涨停板但封不牢&#xff0c;说明在涨停位反复打开&#xff0c;而且成交比较大&#xff0c;因为一只股票出现涨停的时候&#xff0c;一般会有大量的买单排除在买位的位置封住涨停&#xff0…

vue设置标签自定义属性_Vue组件化开发之插槽

插槽为组件提供了强大的扩展能力。我们可以把电脑的主板理解为一个已经封装好的组件&#xff0c;主板上都会预留各种插槽&#xff0c;我们可以往插槽中插入内存条、显卡、声卡等设备。基于同样的思想&#xff0c;Vue在封装组件时&#xff0c;也可以预留插槽&#xff0c;在组件被…

sku设计mysql_基于spring boot拥有完整sku和下单流程的完全商城

一个基于spring boot、spring oauth2.0、mybatis、redis的轻量级、前后端分离、防范xss攻击、拥有分布式锁&#xff0c;为生产环境多实例完全准备&#xff0c;数据库为b2b2c设计&#xff0c;拥有完整sku和下单流程的完全开源商城前言Mall4j项目致力于为中小企业打造一个完整、易…

数据结构铁轨问题_每天5分钟用C#学习数据结构(20)图 Part 1

【基础知识】| 作者 / Edison Zhou这是恰童鞋骚年的第216篇原创文章前面已经介绍了线性表和树两类数据结构&#xff0c;线性表中的元素是“一对一”的关系&#xff0c;树中的元素是“一对多”的关系&#xff0c;本章所述的图结构中的元素则是“多对多”的关系。图(Graph)是一种…

中国大学生计算机设计大赛云南,第14届中国大学生计算机设计大赛云南赛区决赛举行...

掌上春城讯6月19日&#xff0c;2021 年“浪潮杯”云南省大学生计算机设计大赛暨第 14 届中国大学生计算机设计大赛云南赛区决赛在云南工商学院举行。中国大学生计算机设计大赛属于全国高等学校一类竞赛&#xff0c;是一个国家级的以实现高等学校计算机教育培养目标为核心的创新…

jvm gc,gc算法_GC解释:算法

jvm gc,gc算法如前一篇文章中所述&#xff0c;HotSpot JVM中有四个可用的垃圾收集器。 它们之间有一些显着差异&#xff0c;但是用于完成实际工作的算法背后的实际概念非常相似。 在这篇简短的文章中&#xff0c;我将尝试解释三种基本算法&#xff1a; 打标 打标紧凑 标记复…

python 链表倒数第k个节点_链表-删除单链表中倒数第k个节点

题目实现一个函数&#xff0c;一个可以删除单链表中倒数第k个节点难度简单分析本题比较简单&#xff0c;实现方法多种多样&#xff0c;这里提供一种方法首先明确一点&#xff0c;在单链表中删除倒数第k个节点&#xff0c;需要找到他的前一个节点&#xff0c;让前一个节点指向后…

天津计算机中级职称需要什么,天津市中级职称评定条件是什么

天津市中级职称评定条件是什么作者&#xff1a;职称驿站浏览量&#xff1a;5351104时间&#xff1a;2019-04-15转眼间2019年马上就要过完三分之一了&#xff0c;对于2019年的职称评审有很多人早早就开始了相关的准备工作&#xff0c;也有一些人才刚刚想到评审的事情&#xff0c…

jsf el表达式_JSP,JSF和EL简介

jsf el表达式JavaServer页面&#xff0c;JavaServer Faces和表达语言 在本文中&#xff0c;我将研究JavaServer Pages&#xff08;JSP&#xff09;和Expression Language&#xff08;EL&#xff09;&#xff0c;然后将其与JavaServer Faces &#xff08;JSF&#xff09;关联。 …

浅谈防火墙对 FTP 的影响及故障排除

FTP 是常见的基于TCP的网络服务&#xff0c;它使用了两个TCP连接来建立逻辑通信信道&#xff0c;即控制连接和数据连接。当客户端与服务器建立一个FTP会话时&#xff0c;使用TCP创建一个持久的控制连接以传递命令和应答。当发送文件和其它数据传输时&#xff0c;它们在独立的TC…

定向输出命令_数据流的世界,带你了解Linux重定向

今天&#xff0c;小编就带大家一起来看看数据重定向。重定向&#xff1a;将原本输出到标准输出的数据重定向到一个文件中。用于终端显示输出的特殊设备&#xff1a;IO重定向是为了改变默认输入、输出的位置&#xff1a;输出重定向(标准输出STDOUT和标准错误输出STDERR)【>】…

SSH(Secure Shell) 介绍一

文章目录基本原理首次建立连接的时候的公钥交换通过ssh来进行密码登录利用公钥来登录基本原理 SSH&#xff08;Secure Shell&#xff09;是一套协议标准&#xff0c;可以用来实现两台机器之间的安全登录以及安全的数据传送&#xff0c;其保证数据安全的原理是非对称加密。 传…

gc 堆外_GC解释:堆

gc 堆外世代垃圾收集器 JVM堆分为两个不同的世代。 一种称为“年轻”&#xff0c;第二种称为“老”&#xff08;有时称为终身制&#xff09;。 年轻一代又分为两个主要的逻辑部分&#xff1a;伊甸园和幸存者空间。 垃圾收集人员还使用了虚拟空间供年轻人和老年人使用&#xff0…

数据传输协议汇总

文章目录一、FTP(File Transfer Protocol 文件传输协议)&#xff08;一&#xff09;FTP 通讯端口&#xff08;二&#xff09;FTP 支持两种连接模式&#xff08;三&#xff09;缺点&#xff08;四&#xff09;FTP 命令&#xff08;五&#xff09;FTP 响应码&#xff08;六&#…

得力科学计算机怎么求余,山商“郭叔”:妙招讲高数 考研路上得力导师

山东工商学院数学与信息科学学院教授郭林大众网海报新闻记者 屈晨晨 烟台报道“郭老师人特别和蔼&#xff0c;能够和学生们打成一片&#xff0c;不仅讲课风趣&#xff0c;同时也给予了我们很多帮助&#xff0c;私底下我们都喊他郭叔。”这是山东工商学院很多毕业生对郭老师的评…

如何打开笔记本电脑的摄像头_Win8系统笔记本电脑摄像头无法使用的解决办法...

Win8系统电脑摄像头不能用怎么办&#xff1f;使用Win8系统笔记本电脑的用户反映&#xff0c;电脑摄像头无法使用了&#xff0c;这是怎么回事呢&#xff1f;如何解决这个问题&#xff1f;请看下文。解决方法&#xff1a;1、打开计算机中的“控制面板”&#xff0c;如图所示&…

浅析文件传输协议 (ftp) 的工作原理

起初&#xff0c;FTP并不是应用于IP网络上的协议&#xff0c;而是ARPANEt网络中计算机间的文件传输协议&#xff0c; ARPANET是美国国防部组建的老网络&#xff0c;于1960-1980年使用。在那时&#xff0c; FTP的主要功能是在主机间高速可靠地传输文件。目前FTP仍然保持其可靠性…

vb.net 同时给多个属性赋值_Python尚学堂高淇|1721时间表示unix时间点毫秒微秒time模块浮点数自动转换强制转换增强赋值运算符...

017浮点数-自动转换-强制转换-增强赋值运算符浮点数称为float用a*b^10形式表示的科学计数法&#xff0c;比如:3.14,314E-2或者314e-2这些数字在内存当中也是按照科学计数法存储、>>>float(3)3>>>314E-23.14>>>float(“3.14”)3.14>>>int(3…

计算机键盘复制键是哪个,键盘按什么键复制粘贴_键盘上复制粘贴快捷键是哪个键-win7之家...

使用电脑的时候经常会需要使用到复制粘贴功能&#xff0c;许多用户可能会习惯使用右键来复制粘贴&#xff0c;其实这样有点麻烦&#xff0c;比较简单的就是使用快捷键来操作&#xff0c;但是有部分用户还不知道键盘按什么键复制粘贴&#xff0c;如果你也有一样需求的话&#xf…