婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 編寫高質(zhì)量的js之正確理解正則表達(dá)式回溯

編寫高質(zhì)量的js之正確理解正則表達(dá)式回溯

熱門標(biāo)簽:菏澤智能ai電銷機(jī)器人銷售公司 鄂州人工智能電銷機(jī)器人軟件 線上教育ai外呼系統(tǒng) css百度地圖標(biāo)注位置顯示 地圖標(biāo)注商戶中心要收錢多少 宿遷智能外呼系統(tǒng)供應(yīng)商 地圖標(biāo)注字母的軟件 400免費電話去哪申請 實用地圖標(biāo)注app

當(dāng)一個正則表達(dá)式掃描目標(biāo)字符串時,從左到右逐個掃描正則表達(dá)式的組成部分,在每個位置上測試能不能找到一個匹配。對于每一個量詞和分支,都必須確定如何繼續(xù)進(jìn)行。如果是一個量詞(如*、+?或者{2,}),那么正則表達(dá)式必須確定何時嘗試匹配更多的字符;如果遇到分支(通過|操作符),那么正則表達(dá)式必須從這些選項中選擇一個進(jìn)行嘗試。

當(dāng)正則表達(dá)式做出這樣的決定時,如果有必要,它會記住另一個選項,以備返回后使用。如果所選方案匹配成功,正則表達(dá)式將繼續(xù)掃描正則表達(dá)式模板,如果其余部分匹配也成功了,那么匹配就結(jié)束了。但是,如果所選擇的方案未能發(fā)現(xiàn)相應(yīng)匹配,或者后來的匹配也失敗了,正則表達(dá)式將回溯到最后一個決策點,然后在剩余的選項中選擇一個。繼續(xù)這樣,直到找到一個匹配,或者量詞和分支選項的所有可能的排列組合都嘗試失敗后放棄這一過程,然后移動到此過程開始位置的下一個字符上,重復(fù)此過程。

例如,下面的代碼演示了這一過程是如何通過回溯處理分支的。

/h(ello|appy) hippo/.test("hello there, happy hippo");

上面一行正則表達(dá)式用于匹配“hello hippo”或“happy hippo”。測試一開始要查找一個h,目標(biāo)字符串的第一個字母恰好就是h,立刻就找到了。接下來,子表達(dá)式(ello|appy)提供了兩個處理選項。正則表達(dá)式選擇最左邊的選項(分支選擇總是從左到右進(jìn)行),檢查ello 是否匹配字符串的下一個字符,確實匹配,然后正則表達(dá)式又匹配了后面的空格。

然而,在接下來的匹配中正則表達(dá)式“走進(jìn)了死胡同”,因為hippo 中的h 不能匹配字符串中的下一個字母t。此時正則表達(dá)式還不能放棄,因為它還沒有嘗試過所有的選擇,隨后它回溯到最后一個檢查點(在匹配了首字母h 之后的那個位置上)并嘗試匹配第二個分支選項。但由于匹配沒有成功,而且也沒有更多的選項了,正則表達(dá)式認(rèn)為從字符串的第一個字符開始匹配是不能成功的,因此它從第二個字符開始重新進(jìn)行查找。正則表達(dá)式?jīng)]有找到h,繼續(xù)向后找,直到第14 個字母才找到,它匹配happy 的那個h。隨后正則表達(dá)式再次進(jìn)入分支過程,這次ello 未能匹配,但在回溯之后的第二次分支中,它匹配了整個字符串“happy hippo”,匹配成功了。

再如,下面代碼演示了帶重復(fù)量詞的回溯。

var str = "p>Para 1./p>" +"img src='smiley.jpg'>" +"p>Para 2./p>" +"div>Div./div>";
/p>.*\/p>/i.test(str);

正則表達(dá)式先匹配了字符串開始的3個字母p>,然后是.*。點號表示匹配除換行符以外的任意字符,星號這個“貪婪”量詞表示重復(fù)零次或多次,匹配盡量多的次數(shù)。因為目標(biāo)字符串中沒有換行符,正則表達(dá)式將匹配剩下的全部字符串!不過由于正則表達(dá)式模板中還有更多內(nèi)容需要匹配,所以正則表達(dá)式嘗試匹配。由于在字符串末尾匹配不成功,因此每次回溯一個字符,繼續(xù)嘗試匹配,直到正則表達(dá)式回到/div>標(biāo)簽的位置。接下來嘗試匹配\/(轉(zhuǎn)義反斜杠),匹配成功,然后匹配p,匹配不成功。正則表達(dá)式繼續(xù)回溯,重復(fù)此過程,直到第二段末尾時終于匹配了/p>。匹配返回成功需要從第一段頭部一直掃描到最后一個的末尾,這可能不是我們想要的結(jié)果。

將正則表達(dá)式中的“貪婪”量詞*改為“懶惰”(又名“非貪婪”)量詞*?,以匹配單個段落。“懶惰”量詞的回溯工作以相反方式進(jìn)行。當(dāng)正則表達(dá)式/p>.*?\/p>/推進(jìn)到.*?時,首先嘗試全部跳過,然后繼續(xù)匹配\/p>。

這樣做是因為*?匹配零次或多次,盡可能少重復(fù),盡可能少意味著可以重復(fù)零次。但是,當(dāng)隨后的在字符串的這一點上匹配失敗時,正則表達(dá)式回溯并嘗試下一個最小的字符數(shù):1個。正則表達(dá)式繼續(xù)像這樣向前回溯到第一段的末尾,在那里量詞后面的\/p>得到完全匹配。

如果目標(biāo)字符串只有一個段落,那么此正則表達(dá)式的“貪婪”版本和“懶惰”版本是等價的,但嘗試匹配的過程不同。

當(dāng)一個正則表達(dá)式占用瀏覽器幾秒甚至更長時間時,問題原因很可能是回溯失控。為說明此問題,給出下面的正則表達(dá)式,它的目標(biāo)是匹配整個HTML文件。此表達(dá)式被拆分成多行是為了適合頁面顯示。與其他正則表達(dá)式不同,JavaScript在沒有選項時可使點號匹配任意字符,包括換行符,所以此例中以[\s\S]匹配任意字符。

/html>[\s\S]*?head>[\s\S]*?title>[\s\S]*?\/title>[\s\S]*?\/head>
[\s\S]*?body>[\s\S]*?\/body>[\s\S]*?\/html>/

此正則表達(dá)式匹配在正常HTML 字符串時工作良好,但當(dāng)目標(biāo)字符串缺少一個或多個標(biāo)簽時,就會變得十分糟糕。例如/html>標(biāo)簽缺失,最后一個[\s\S]*?將擴(kuò)展到字符串的末尾,因為在那里沒有發(fā)現(xiàn)/html>標(biāo)簽,然后正則表達(dá)式將查看此前的[\s\S]*?隊列記錄的回溯位置,使它們進(jìn)一步擴(kuò)大。正則表達(dá)式嘗試擴(kuò)展倒數(shù)第二個[\s\S]*?—用它匹配/body>標(biāo)簽,就是此前匹配過正則表達(dá)式模板\/body>的那個標(biāo)簽,然后繼續(xù)查找第二個/body>標(biāo)簽,直到字符串的末尾。當(dāng)所有這些步驟都失敗時,倒數(shù)第三個[\s\S]*?將被擴(kuò)展,直至字符串的末尾,依此類推。

此類問題的解決辦法在于盡可能具體地指出分隔符之間的字符匹配形式,如模板“.*?”用于匹配雙引號包圍的一個字符串。用更具體的[^"\rn]*取代過于寬泛的.*?就去除了回溯時可能發(fā)生的幾種情況,如嘗試用點號匹配引號,或者擴(kuò)展搜索超出預(yù)期范圍。

在HTML 的例子中解決辦法不是那么簡單。不能使用否定字符類型,如用[^]替代[\s\S],因為在搜索過程中可能會遇到其他類型的標(biāo)簽。但是,可以通過重復(fù)一個非捕獲組來達(dá)到同樣效果,它包含一個回溯(阻塞下一個所需的標(biāo)簽)和[\s\S](任意字符)元序列。這樣可以確保中間位置上查找的每個標(biāo)簽都會失敗。然后,更重要的是,[\s\S]模板在回溯過程中阻塞的標(biāo)簽在被發(fā)現(xiàn)之前不能被擴(kuò)展。應(yīng)用此方法后對正則表達(dá)式的最終修改如下:

/html>(?:(?!head>)[\s\S])*head>(?:(?!title>)[\s\S])*title>

(?:(?!\/title>)[\s\S])*\/title>(?:(?!\/head>)[\s\S])*\/head>

(?:(?!body>)[\s\S])*body>(?:(?!\/body>)[\s\S])*\/body>
(?:(?!\/html>)[\s\S])*\/html>/

雖然這樣做消除了潛在的回溯失控,并允許正則表達(dá)式在匹配不完整HTML字符串失敗時的使用時間與文本長度呈線性關(guān)系,但是正則表達(dá)式的效率并沒有提高。像這樣為每個匹配字符進(jìn)行多次前瞻,缺乏效率,而且成功匹配過程也相當(dāng)慢。匹配較短字符串時使用此方法相當(dāng)不錯,而匹配一個HTML 文件可能需要前瞻并測試上千次。

您可能感興趣的文章:
  • 正則中的回溯定義與用法分析【JS與java實現(xiàn)】
  • javascript遞歸回溯法解八皇后問題
  • 最佳的JavaScript錯誤處理實踐
  • Javascript模塊化編程(一)模塊的寫法最佳實踐
  • 5個最佳的Javascript日期處理類庫分享
  • JS trim去空格的最佳實踐
  • 通過百度地圖獲取公交線路的站點坐標(biāo)的js代碼
  • js回溯法計算最佳旅行線路代碼實例

標(biāo)簽:綿陽 三亞 梅州 咸陽 恩施 池州 鞍山 六安

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《編寫高質(zhì)量的js之正確理解正則表達(dá)式回溯》,本文關(guān)鍵詞  編寫,高質(zhì)量,的,之,正確理解,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《編寫高質(zhì)量的js之正確理解正則表達(dá)式回溯》相關(guān)的同類信息!
  • 本頁收集關(guān)于編寫高質(zhì)量的js之正確理解正則表達(dá)式回溯的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲尤物在线视频观看| 91理论电影在线观看| 在线播放中文字幕一区| 亚洲午夜一区二区三区| 欧美视频在线观看一区| 亚洲精品国产a久久久久久 | 成人精品视频一区| 成人欧美一区二区三区黑人麻豆 | 日韩av中文在线观看| 这里只有精品视频在线观看| 奇米影视一区二区三区小说| 日韩午夜在线播放| 国产ts人妖一区二区| 中文字幕一区二区三区精华液 | 大桥未久av一区二区三区中文| 中文字幕av免费专区久久| 色又黄又爽网站www久久| 亚洲va天堂va国产va久| 欧美电影免费观看高清完整版在线观看 | 亚洲成在人线免费| 日韩女同互慰一区二区| 成人深夜视频在线观看| 亚洲小说春色综合另类电影| 欧美xxx久久| 丁香激情综合国产| 亚洲大片精品永久免费| 久久久久久久综合色一本| 99久久精品国产网站| 性感美女极品91精品| 久久久久久久国产精品影院| 色综合久久88色综合天天免费| 日韩高清国产一区在线| 国产欧美日韩在线观看| 欧美日韩一区二区在线观看 | 国产激情一区二区三区| 一区二区三国产精华液| 日韩欧美久久一区| 在线观看日韩电影| 国产一本一道久久香蕉| 亚洲综合一区二区精品导航| 2020国产精品| 欧美三级三级三级| av一区二区三区| 久久国产日韩欧美精品| 一区二区三区在线视频观看58| 久久久久久久久久久久久久久99 | 欧美日韩亚洲综合一区| 粉嫩13p一区二区三区| 日本不卡的三区四区五区| 亚洲同性同志一二三专区| 久久亚洲二区三区| 国产精品免费丝袜| 26uuu国产电影一区二区| 欧美日韩国产经典色站一区二区三区| 国产成人超碰人人澡人人澡| 蜜桃久久久久久| 亚洲成人动漫精品| 亚洲黄色小视频| 国产精品你懂的在线| 久久看人人爽人人| 精品日产卡一卡二卡麻豆| 欧美欧美午夜aⅴ在线观看| 一本到一区二区三区| 成人综合激情网| 国产九九视频一区二区三区| 久久国产精品露脸对白| 秋霞午夜av一区二区三区| 亚洲国产综合人成综合网站| 亚洲乱码国产乱码精品精98午夜| 国产精品久久久久久久久搜平片| 久久精品一二三| 2020国产精品自拍| 久久久一区二区三区| 精品免费国产一区二区三区四区| 欧美日韩高清在线| 欧美日本一区二区| 欧美一级理论性理论a| 6080午夜不卡| 欧美一区二区在线观看| 欧美另类videos死尸| 精品视频在线免费看| 在线成人av网站| 91精品国产综合久久香蕉麻豆| 欧美日韩你懂得| 欧美肥胖老妇做爰| 日韩欧美中文字幕制服| 日韩精品一区二区在线| 精品伦理精品一区| 久久久精品黄色| 国产精品久久久一区麻豆最新章节| 国产精品白丝在线| 亚洲男同1069视频| 香蕉久久夜色精品国产使用方法| 亚洲aaa精品| 久久精品国产亚洲一区二区三区| 六月丁香综合在线视频| 国产麻豆成人传媒免费观看| 成人黄色免费短视频| 一本久久a久久精品亚洲| 欧美日韩一区二区三区高清| 91精品中文字幕一区二区三区| 欧美大尺度电影在线| 中文字幕欧美日本乱码一线二线| 一区精品在线播放| 亚洲超碰精品一区二区| 麻豆极品一区二区三区| 成人视屏免费看| 欧洲一区二区av| 日韩免费一区二区三区在线播放| 久久久精品免费免费| 一区二区三区四区不卡视频| 免费看欧美美女黄的网站| 大美女一区二区三区| 欧美性生活大片视频| 2024国产精品视频| 亚洲天天做日日做天天谢日日欢| 天堂成人免费av电影一区| 国产精品白丝av| 欧美又粗又大又爽| 久久久影视传媒| 午夜精品爽啪视频| 成人永久aaa| 日韩一区二区三区视频| 最新不卡av在线| 久久黄色级2电影| 91色.com| 久久久久久免费| 婷婷国产v国产偷v亚洲高清| 成人美女视频在线观看18| 91精品综合久久久久久| 亚洲人精品一区| 韩国av一区二区三区四区 | 538prom精品视频线放| 国产亚洲精品福利| 日本在线播放一区二区三区| a级精品国产片在线观看| 日韩久久久精品| 亚洲综合在线视频| 不卡在线观看av| www国产亚洲精品久久麻豆| 五月天国产精品| 色视频一区二区| 日本一区二区三区在线不卡| 免费人成网站在线观看欧美高清| 欧洲av一区二区嗯嗯嗯啊| 日本一区免费视频| 国产精品一卡二卡| 欧美一级免费大片| 亚洲综合久久av| 色拍拍在线精品视频8848| 国产精品三级av在线播放| 国产精品一区二区三区乱码 | 久久国产精品99精品国产| 欧美色手机在线观看| 亚洲图片欧美综合| 欧美优质美女网站| 依依成人综合视频| 一本色道久久综合狠狠躁的推荐| 欧美国产一区在线| 国产成人免费视频网站| 久久亚洲私人国产精品va媚药| 麻豆一区二区在线| 日韩一级二级三级| 久久激五月天综合精品| 精品国产百合女同互慰| 久久草av在线| 亚洲精品一区二区精华| 精品一区二区三区免费播放| 欧美成人猛片aaaaaaa| 美女脱光内衣内裤视频久久影院| 日韩亚洲欧美一区| 久久精品国产亚洲一区二区三区| 日韩一卡二卡三卡四卡| 老司机免费视频一区二区| 欧美成人免费网站| 国产精品一区二区免费不卡| 国产精品麻豆99久久久久久| av成人免费在线| 一区二区三区.www| 884aa四虎影成人精品一区| 麻豆精品久久久| 国产网站一区二区三区| 成人精品一区二区三区四区| 亚洲欧洲日本在线| 在线影院国内精品| 日本成人在线视频网站| 日韩欧美高清dvd碟片| 国产成人免费视频精品含羞草妖精| 中文字幕不卡三区| 91电影在线观看| 日韩精品免费视频人成| 久久久久国产免费免费| 99综合影院在线| 亚洲大型综合色站| 久久久三级国产网站| 91欧美一区二区| 天天操天天色综合| 亚洲国产精品成人综合| 在线精品视频一区二区三四| 久久精品国产99久久6|