如何用正则表达式杀死Java

我们最近偶然发现了一个我们绝对不了解的现象:您可以使用简单的正则表达式杀死任何Java IDE以及任何Java进程…

回到大学后,我被告知正则表达式(称为正则语法或3型语法)总是以有限状态的自动机结束,因此可以在线性时间内进行处理(输入长度​​加倍,处理时间加倍)。 但是,这仅适用于“理智”的表达式。 正则表达式也可能导致不确定的有限状态自动机,事情可能会变得很糟。

考虑一下表达式:(0 *)* A这将是任意数量的零,后跟一个大写的A。现在,如果对该表达式使用Matcher.find() ,那么只要输入中存在匹配项,一切都很好。 但是,如果您以“ 00000000000000000000”作为输入调用此程序,则程序将挂起(Eclipse或IntelliJ中的regex控制台以及每个(基于Java的)在线正则表达式服务也将挂起)。

乍一看似乎是一个无限循环,但变成了灾难性的回溯 。 这基本上意味着匹配器检测到在输入末尾没有找到A。 现在,外部量词继续向后退–内在量词又一次向前–没有结果。 因此,匹配器将逐步重试所有组合以找到匹配项。 它最终将返回(没有匹配项),但是它的复杂性(以及因此的运行时)是幂的(将一个字符添加到输入中会使运行时加倍)。 可以在这里找到详细的描述: 灾难性的回溯

这是我测量的一些运行时(对于每个添加的字符,运行时几乎几乎翻了一番):

0000000000: 0.1ms
00000000000: 0.2ms
000000000000: 0.7ms
0000000000000: 1.3ms
00000000000000: 1.7ms
000000000000000: 3.5ms
0000000000000000: 7.2ms
00000000000000000: 13.9ms
000000000000000000: 27.5ms
0000000000000000000: 55.5ms
00000000000000000000: 113.0ms
000000000000000000000: 226.4ms
0000000000000000000000: 439.1ms
00000000000000000000000: 886.0ms

简要说明一下:对于像这样的微型基准测试,由于HotSpot JIT将在某个时候跳入并优化代码,因此您始终需要“预热” JVM。 因此,第一次运行如下所示:

0000000000: 6.8ms
00000000000: 11.8ms
000000000000: 25.5ms
0000000000000: 39.5ms
00000000000000: 6.3ms   <- JIT jumped in and started to translate
000000000000000: 5.4ms     to native code.
0000000000000000: 7.1ms
00000000000000000: 14.2ms
000000000000000000: 26.8ms
0000000000000000000: 54.4ms
00000000000000000000: 109.6ms
000000000000000000000: 222.1ms
0000000000000000000000: 439.2ms
00000000000000000000000: 885.6ms

那么,这里的要点是什么? 如果您正在运行服务器应用程序或许多用户使用的关键操作,除非您真的信任他们,否则不要让他们输入正则表达式。 那里有正则表达式实现,可以检测到此问题并中止,但是Java(JDK 8以下)没有。

注意: 您可以使用本地IDE或小型Java程序来测试此内容,但是请不要开始淘汰那里的所有regex测试器网站。 那些家伙免费提供了一个不错的工具,所以这是相当不公平的。

这是我使用的微小基准:

public class Test {public static void main(String[] args) {for (int runs = 0; runs < 2; runs++) {Pattern pattern = Pattern.compile("(0*)*A");// Run from 5 to 25 charactersfor (int length = 5; length < 25; length++) {// Build input of specified lengthString input = "";for (int i = 0; i < length; i++) { input += "0"; }// Measure the average duration of two calls... long start = System.nanoTime();for (int i = 0; i < 2; i++) {pattern.matcher(input).find();}System.out.println(input + ": " + ((System.nanoTime() - start) / 2000000d) + "ms");}}}
}

参考: Andy的软件工程专栏博客中的JCG合作伙伴 Andreas Haufler 提供了如何使用正则表达式杀死Java 。

翻译自: https://www.javacodegeeks.com/2013/09/how-to-kill-java-with-a-regular-expression.html

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

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

相关文章

php for next,Nextcloud停留无限登录页面 PHP7的问题及解决方案

Nextcloud 14或者15 无法打开登录界面出现错误信息如下&#xff1a;内部服务器错误服务器不能完成你的请求。如果再次发生&#xff0c;请在下方将技术详情发送给服务器管理员。更多细节可以在服务器日志中找到.技术细节远程地址: 210.22.126.186请求 ID: kSPvbdWDU7yvwng3516v请…

开发VUE使用第三库,发现有bug怎么办?

写在前面 本文只针对使用vue技术栈&#xff0c;进行讨论。 正文 使用vue技术栈开发&#xff0c;难免会使用第三库&#xff0c;这大大提高了我们开发的效率。然而&#xff0c;这是第三方库有bug怎么办&#xff1f; 既然有bug&#xff0c;就是现有功能没有达到预想效果。除了&a…

Java正则表达式中的反向引用

Java正则表达式中的反向引用是Java提供的另一个重要功能。 要了解反向引用 &#xff0c;我们首先需要了解群组 。 正则表达式中的分组意味着将多个字符视为一个单元。 通过将要分组的字符放在一组括号“&#xff08;&#xff09;”中来创建它们。 每组括号对应一个组 。 反向引…

SpringMVC原理MVC设计思想

什么是MVC&#xff1f; MVC是一种架构模式 --- 程序分层&#xff0c;分工合作&#xff0c;既相互独立&#xff0c;又协同工作 MVC是一种思考方式 --- 需要将什么信息展示给用户? 如何布局&#xff1f; 调用哪些业务逻辑&#xff1f; MVC流程图如下图所示&#xff1a; MVC核心思…

Hbase 的javaAPI基本操作用 在idea上的实现

1.保证集群开启&#xff1a; jps有如下进程 2.pom文件中的依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sche…

用php求矩形周长,PHP实现的简单三角形、矩形周长面积计算器分享

运用php面向对象的知识设计一个图形计算器&#xff0c;同时也运用到了抽象类知识&#xff0c;这个计算器可以计算三角形的周长和面积以及矩形的周长和面积。本图形计算器有4个页面&#xff1a;1.php图形计算器主页index.php; 2.形状的抽象类shape.class.php; 3三角形计算…

ECMAScript Decorators---装饰器

ECMAScript Decorators---装饰器 Decorators是什么 Decorators可以改变类方法和类实例字段的属性和行为&#xff0c;使我们可以灵活地使用更简单的语法动态实现这些内容&#xff0c;是非侵入式的。---举例&#xff0c;你给手机添加一个外壳罢了&#xff0c;并不影响手机原有的…

php试卷A高质量含答案,php试卷A高质量含答案

《php试卷A高质量含答案》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《php试卷A高质量含答案(4页珍藏版)》请在金锄头文库上搜索。1、装订线得 分评卷人合肥滨湖职业技术学院17-18学年度第二学期PHP期末考试卷(A)班级&#xff1a; 学号&#xff1a; 姓名&#xff1…

旅行报告:JavaOne 2013 –重归荣耀

我已经回来几天了&#xff0c;需要赶上过去几天一直搁置的所有事情。 对我来说&#xff0c;这是一年中最忙的时间。 JavaOne和OpenWorld在旧金山的整整一周。 一个非常简短的旅行报告。 年度ACED简报 你们中许多人都知道我是Oracle社区认可计划&#xff08;称为“ ACE计划 ”&…

ElasticSearch 数据分片

一、ElasticSearch 分片 ElasticSearch集群中有许多个节点(Node)&#xff0c;每一个节点实例就是一个实例&#xff1b;数据分布在分片之间。集群的容量和性能主要取决于分片如何在节点上如何分配。将数据分片是为了提高可处理的容量和易于进行水平扩展&#xff0c;为分片做副本…

Unity3D_(游戏)2D坦克大战 像素版

2D坦克大战 像素版 游戏规则&#xff1a;  玩家通过上、下、左、右移动坦克&#xff0c;空格键发射子弹 敌人AI出身时朝向己方大本营(未防止游戏快速结束&#xff0c;心脏上方三个单位障碍物设为刚体)    当玩家被击杀次数>3  或  心脏被子弹击穿  重新加载游戏…

认识Skeleton Screen【屏幕加载骨架】

一直以来&#xff0c;无论是web还是iOS、android的应用中&#xff0c;为了提升应用的加载等待这段时间的用户感知体验&#xff0c;各种奇门遁甲之术层出不穷。其中&#xff0c;菊花图以及由它衍生各种加载动画是一个非常大的流派&#xff0c;如下图所示&#xff1a;由它衍生而出…

一日三项令人兴奋的Lucene功能

昨天是富有成效的一天&#xff1a;突然&#xff0c;Lucene有了三个令人兴奋的新功能。 表达式模块 昨天提交的第一个功能是新的expressions模块 。 这使您可以使用任意String表达式定义用于排序的动态字段。 内置了对JavaScript解析的支持&#xff0c;但是如果您想创建自己的语…

php date当天,php5中date()获得的时间不是当前时间的解决方法

自php5.10起加入了时区的设置&#xff0c;在php中显示的时间都是格林威治标准时间&#xff0c;因此便与中国的用户会差八个小时。修改php.ini中的 date.timezone 参数&#xff1a;复制代码 代码如下:[Date]; Defines the default timezone used by the date functions;date.tim…

listening for variable changes in javascript

https://stackoverflow.com/questions/1759987/listening-for-variable-changes-in-javascript转载于:https://www.cnblogs.com/wangjixianyun/p/9115336.html

JPA EntityListeners中的Spring注入的Bean

在使用JPA侦听器进行数据库加密中&#xff0c;我讨论了使用JPA EntityListener进行透明加密。 从某种意义上说&#xff0c;这种方法是透明的&#xff0c;因为JPA实体&#xff08;几乎&#xff09;完全不知道正在加密&#xff0c;而JPA EntityListener本身也不知道细节。 有一个…

php sql 去除重复数据,MSSQL_快速删除重复记录,SQL Server如何实现?,如果一张表的数据达到上百万 - phpStudy...

如果一张表的数据达到上百万条&#xff0c;用游标的方法来删除简直是个噩梦&#xff0c;因为它会执行相当长的一段时间……开发人员的噩梦——删除重复记录想必每一位开发人员都有过类似的经历&#xff0c;在对数据库进行查询或统计的时候不时地会碰到由于表中存在重复的记录而…

Python运行的方式

Python的运行方式多种多样&#xff0c;下面列举几种: 交互式 在命令行中输入python&#xff0c;然后在>>>提示符后面输入Python语句&#xff0c;这里需要注意: 1 语句前面不能有空格&#xff0c;否则会报错 2 对于符合语句&#xff0c;前面会有...提示符&#xff0c;结…

使用Apache Zookeeper进行协调和服务发现

面向服务的设计已被证明是针对各种不同的分布式系统的成功解决方案。 如果使用得当&#xff0c;它会带来很多好处。 但是随着服务数量的增加&#xff0c;了解部署什么以及部署在何处变得更加困难。 而且&#xff0c;由于我们正在构建可靠且高度可用的系统&#xff0c;因此还需要…

微信小程序无埋点数据采集方案

作者&#xff1a;lxj&#xff0c;点餐终端团队成员前言 相信业务团队对这样的场景不会太陌生&#xff1a;打点需求&#xff1a; 每新上一个功能&#xff0c;数据产品便会同步加上打点需求&#xff0c;当数据打点上线后一段时间&#xff0c;数据产品/业务产品便会针对数据的转化…