日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

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

發(fā)布時(shí)間:2023/12/3 java 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 正则表达式使用_如何用正则表达式杀死Java 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

java 正則表達(dá)式使用

我們最近偶然發(fā)現(xiàn)了一個(gè)我們絕對(duì)不了解的現(xiàn)象:您可以使用簡(jiǎn)單的正則表達(dá)式殺死任何Java IDE以及任何Java進(jìn)程…

回到大學(xué)后,我被告知正則表達(dá)式(稱為正則語(yǔ)法或3型語(yǔ)法)總是以有限狀態(tài)的自動(dòng)機(jī)結(jié)束,因此可以在線性時(shí)間內(nèi)進(jìn)行處理(輸入長(zhǎng)度??加倍,處理時(shí)間加倍)。 但是,這僅適用于“理智”的表達(dá)式。 正則表達(dá)式也可能導(dǎo)致不確定的有限狀態(tài)自動(dòng)機(jī),事情可能變得很糟糕。

考慮表達(dá)式:(0 *)* A這將是任意數(shù)量的零,后跟一個(gè)大寫(xiě)的A。現(xiàn)在,如果對(duì)該表達(dá)式使用Matcher.find() ,只要輸入中存在匹配項(xiàng),一切都很好。 但是,如果您以“ 00000000000000000000”作為輸入調(diào)用此程序,則程序?qū)炱?#xff08;Eclipse或IntelliJ中的regex控制臺(tái)以及每個(gè)(基于Java的)在線正則表達(dá)式服務(wù)也將掛起)。

乍一看似乎是一個(gè)無(wú)限循環(huán),但變成了災(zāi)難性的回溯 。 這基本上意味著匹配器檢測(cè)到在輸入末尾沒(méi)有找到A。 現(xiàn)在,外部量詞繼續(xù)向后退–內(nèi)在量詞又一次向前–沒(méi)有結(jié)果。 因此,匹配器會(huì)逐步重試所有組合以找到匹配項(xiàng)。 它最終將返回(沒(méi)有匹配項(xiàng)),但是它的復(fù)雜性(以及因此的運(yùn)行時(shí)間)是指數(shù)性的(在輸入中添加一個(gè)字符會(huì)使運(yùn)行時(shí)間加倍)。 可以在這里找到詳細(xì)的描述: 災(zāi)難性的回溯

這是我測(cè)量的一些運(yùn)行時(shí)(對(duì)于每個(gè)添加的字符,運(yùn)行時(shí)幾乎幾乎翻了一番):

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

附帶說(shuō)明一下:對(duì)于像這樣的微型基準(zhǔn)測(cè)試,您總是需要“預(yù)熱” JVM,因?yàn)镠otSpot JIT將在某個(gè)時(shí)候跳入并優(yōu)化代碼。 因此,第一次運(yùn)行如下所示:

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

那么,這里的要點(diǎn)是什么? 如果您正在運(yùn)行服務(wù)器應(yīng)用程序或許多用戶使用的關(guān)鍵操作,除非您真的信任他們,否則不要讓他們輸入正則表達(dá)式。 那里有正則表達(dá)式實(shí)現(xiàn),可以檢測(cè)到此問(wèn)題并中止,但是Java(最高JDK 8)沒(méi)有。

注意: 您可以使用本地IDE或小型Java程序來(lái)測(cè)試此內(nèi)容,但是請(qǐng)不要開(kāi)始淘汰那里的所有regex測(cè)試器網(wǎng)站。 那些家伙免費(fèi)提供了一個(gè)不錯(cuò)的工具,所以這將是相當(dāng)不公平的。

這是我使用的微小基準(zhǔn):

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 提供了如何使用正則表達(dá)式殺死Java 。

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

java 正則表達(dá)式使用

總結(jié)

以上是生活随笔為你收集整理的java 正则表达式使用_如何用正则表达式杀死Java的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。