中国外贸网站有哪些问题,谷歌商店下载官方,wordpress小程序 守望轩,网站搜索量查询最近#xff0c;我收到了Packt出版的Anubhava Srivastava提供的免费书籍“ Java 9 Regular Expressions” 。 这本书是一个很好的教程#xff0c;它向任何想学习正则表达式并从头开始的人介绍。 那些知道如何使用正则表达式的人可能仍然很有趣#xff0c;以重申其知识并加深… 最近我收到了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 对于appendReplacement和appendTail 唯一的区别是该参数还可以是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(?pluralz?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调用方法之前计算。 在新版本中字符串作为FunctionMatchResult,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所以计数器不能为int或Integer变量。 我们需要一个具有int值并且可以更改的对象。 即使我们不使用AtomicInteger的原子功能它也是如此。 下一个示例更进一步并进行了一些数学计算。 它将字符串中的任何浮点格式的数字替换为其正弦值。 这样由于sinpi甚至与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