java 正则表达式使用_如何用正则表达式杀死Java

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

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

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

java 正则表达式使用

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

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

相关文章

java 合并到一行_mysql中将多行数据合并成一行数据

一个字段可能对应多条数据&#xff0c;用mysql实现将多行数据合并成一行数据例如&#xff1a;一个活动id(activeId)对应多个模块名(modelName),按照一般的sql语句&#xff1a;1 SELECT am.activeId,m.modelName2 FROM activemodel am3 JOIN model m4 ON am.modelId m.modelId5…

容器化Spring Data Cassandra应用程序

我正在继续学习Docker的旅程。 在这一点上&#xff0c;我仍然保持简单。 这次&#xff0c;我将解决将Spring和Cassandra应用程序转换为使用容器而不是在主机上本地运行的问题。 更准确地说&#xff0c;使用Spring Data Cassandra整理应用程序。 我希望我前几天看过进行此更改。…

最快的 java 图像_ImageJ 1.53 世界上最快的Java图像处理程序

ImageJ 1.53 世界上最快的Java图像处理程序 已通过小编安装运行测试 100%可以使用。ImageJ 1.53 是世界上最快的纯Java图像处理程序。它可以在0.1秒内过滤2048x2048图像。每秒可以处理4000万像素的图片。ImageJ支持处理8位灰度或索引颜色&#xff0c;16位无符号整数&#xff0c…

java字节码提取if语句_终于找到了!有了它你就可以读懂字节码了!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼0x80 ior 将栈顶两int型数值作“按位或”并将结果压入栈顶0x81 lor 将栈顶两long型数值作“按位或”并将结果压入栈顶0x82 ixor 将栈顶两int型数值作“按位异或”并将结果压入栈顶0x83 lxor 将栈顶两long型数值作“按位异或”并将结…

maven设置代理服务器_使用Maven设置您的应用服务器

maven设置代理服务器在许多情况下&#xff0c;无需事先设置应用程序就无法部署应用程序。 在JBoss AS 7.x中&#xff0c;您可能需要配置例如数据库连接。 或者&#xff0c;您必须配置一个安全领域。 也许您还想调整SLSB池…在任何情况下&#xff0c;团队中的所有开发人员都必须…

java编程中的di是什么_java-在Spring IoC / DI中使用@Component注释对接口...

在Spring类中,通常使用Component注释接口,特别是对于某些Spring构造型注释&#xff1a;package org.springframework.stereotype;...Componentpublic interface Service {...}要么 &#xff1a;package org.springframework.boot.test.context;...Componentpublic interface Te…

使用React和Spring Boot构建一个简单的CRUD应用

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 React的设计使创建交互式UI变得轻松自如。 它的状态管理非常有效&#xff0c;并且仅在…

java初始化该字符串值_java字符串数组初始化和赋值

//一维数组String[] str new String[5]; //创建一个长度为5的String(字符串)型的一维数组String[] str new String[]{“”,””,””,””,””};String[] str {“”,””,””,””,””};String数组初始化区别首先应该明白java数组里面存的是对象的引用&#xff0c;所以必…

java 无法找到ant_Java-Ant需要tools.jar并且无法找到我

Java-Ant需要tools.jar并且无法找到我我将一个Java程序的开发环境放在一起&#xff0c;并且在第一次尝试使用Ant构建脚本后&#xff0c;出现了以下错误&#xff1a;Unable to locate tools.jar. Expected to find it in /usr/lib/jvm/java-6-openjdk/lib/tools.jar虽然通往jdk的…

js实现日历框上一日下一日_一日三项令人兴奋的Lucene功能

js实现日历框上一日下一日昨天是富有成效的一天&#xff1a;突然&#xff0c;Lucene有了三个令人兴奋的新功能。 表达式模块 昨天提交的第一个功能是新的expressions模块 。 这使您可以使用任意String表达式定义用于排序的动态字段。 内置了对JavaScript解析的支持&#xff0c…

使用CUBA进行开发–是Spring的重大转变吗?

阅读另一个供内部公司使用的Web项目的要求时&#xff0c;您&#xff08;至少是我自己&#xff09;通常会看到一个很普通的集合&#xff1a;定义明确的数据存储结构&#xff08;或有时是现有的旧式DB&#xff09;&#xff0c;大量的数据输入形式&#xff0c;非常复杂的业务逻辑&…

java 伴随矩阵_C#计算矩阵的逆矩阵方法实例分析

本文实例讲述了C#计算矩阵的逆矩阵方法。分享给大家供大家参考。具体如下&#xff1a;1.代码思路1)对矩阵进行合法性检查&#xff1a;矩阵必须为方阵2)计算矩阵行列式的值(Determinant函数)3)只有满秩矩阵才有逆矩阵&#xff0c;因此如果行列式的值为0(在代码中以绝对值小于1E-…

apache camel_探索Apache Camel Core –文件组件

apache camel文件轮询器是解决常见IT问题的非常有用的机制。 Camel的内置file组件非常灵活&#xff0c;并且有许多选项可用于配置。 让我们在这里介绍一些常用用法。 轮询目录以输入文件 这是一条典型的骆驼Route用于每秒轮询一次目录以查找输入文件。 import org.slf4j.*; i…

java list 遍历 remove_JAVA中LISt遍历时如何remove元素?

import java。util。*;  public class object {  public static void main(String[] args) {  String str1 new String("abcde");  String str2 new String("abcde");  String str3 new String("abcde");  String str4 new Stri…

Java使用者的延期执行

在前面的博客文章&#xff08;“ 延迟执行Java的供应商 “&#xff09;&#xff0c;我引用礁HORSTMANN的陈述书中‘ 的Java SE8为真的很急关于lambda表达式’&#xff0c;‘所有的lambda表达式的点被推迟执行 。’ Horstmann在最后一年为Dobb博士的杂志写了一篇名为“ Java 8中…

java 代码造假_老板居然让我在Java项目中“造假”

1. 前言老板说&#xff0c;明天甲方要来看产品&#xff0c;你得造点数据&#xff0c;而且数据必须是“真”的&#xff0c;演示效果要好看一些&#xff0c;这样他才会买我们的产品&#xff0c;我好明年给你换个嫂子。一般开发接到这种过分要求都不会很乐意去做&#xff0c;这完全…

nginx php环境搭建_php+nginx环境配置

本篇文章的内容是PHP和nginx环境的配置&#xff0c;在这里分享给大家&#xff0c;也给有需要的朋友一个参考phpnginx环境配置1、首先需要准备的应用程序包。nginx&#xff1a;nginx/Windows-1.0.4php&#xff1a;php-5.2.16-nts-Win32-VC6-x86.zip (nginx下php是以FastCGI的方式…

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

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

php如何禁用浏览器的缓存,php如何禁止浏览器使用缓存页面

【摘要】PHP即“超文本预处理器”&#xff0c;是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言&#xff0c;与C语言类似&#xff0c;是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。下面是php如何禁止浏览器使用缓存页面&#xff0c;让我…

使用Java EE和OIDC构建Java REST API

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 Java EE允许您使用JAX-RS和JPA快速轻松地构建Java REST API。 Java EE是保护伞标准规…