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

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

編寫高質量的js之正確理解正則表達式回溯

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

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

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

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

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

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

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

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

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

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

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

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

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

當一個正則表達式占用瀏覽器幾秒甚至更長時間時,問題原因很可能是回溯失控。為說明此問題,給出下面的正則表達式,它的目標是匹配整個HTML文件。此表達式被拆分成多行是為了適合頁面顯示。與其他正則表達式不同,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>/

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

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

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

/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>/

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

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

標簽:綿陽 三亞 梅州 咸陽 恩施 池州 鞍山 六安

巨人網絡通訊聲明:本文標題《編寫高質量的js之正確理解正則表達式回溯》,本文關鍵詞  編寫,高質量,的,之,正確理解,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《編寫高質量的js之正確理解正則表達式回溯》相關的同類信息!
  • 本頁收集關于編寫高質量的js之正確理解正則表達式回溯的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    色偷偷88欧美精品久久久| 欧美aaa在线| 欧美日韩国产一级片| 高清国产一区二区三区| 午夜av区久久| 一区二区三区四区不卡视频| 最近中文字幕一区二区三区| 亚洲午夜精品在线| 亚洲欧美在线视频观看| 玉米视频成人免费看| 激情久久五月天| 日韩视频在线你懂得| 欧美一区二区大片| 中日韩免费视频中文字幕| 一区二区三区在线免费播放| 国产一二精品视频| 欧美电影一区二区| 伊人色综合久久天天人手人婷| 国产在线不卡视频| 不卡视频一二三| 喷白浆一区二区| 91精品一区二区三区久久久久久| 国产精品白丝在线| 成人综合在线视频| 久久精品免费在线观看| 国产一区二区三区av电影| 日韩三级电影网址| 亚洲 欧美综合在线网络| av电影一区二区| 国产精品理伦片| 色综合天天综合网国产成人综合天| 精品在线免费观看| 激情小说欧美图片| 三级不卡在线观看| 久久影音资源网| 国产精品99久久久久久久女警 | 欧美激情一区二区三区| 亚洲国产美女搞黄色| 91福利在线导航| 日韩高清不卡一区二区三区| 中文字幕乱码亚洲精品一区| 日韩精品久久理论片| 欧美一区二区三区视频免费播放| 日本欧美加勒比视频| 国产欧美一区二区三区网站| 国产99一区视频免费| 欧美日韩亚洲综合一区二区三区| 不卡av电影在线播放| 日本亚洲免费观看| 亚洲欧美在线视频| 欧美一区二区三区视频| 成人毛片视频在线观看| 亚洲第一在线综合网站| 精品国产免费视频| 欧美精品色一区二区三区| 国产成人av电影在线观看| 亚洲高清免费观看| 国产精品色在线| √…a在线天堂一区| 91精品国产综合久久蜜臀| 色综合色狠狠综合色| 国产999精品久久久久久| 极品少妇xxxx偷拍精品少妇| 亚洲一区二区欧美日韩 | 国产乱子伦视频一区二区三区 | 亚洲国产日韩精品| 国产精品欧美一区喷水| 欧美成人精精品一区二区频| 欧美日韩免费高清一区色橹橹| 91在线观看成人| 一本在线高清不卡dvd| 91视频观看视频| 色哟哟国产精品| 91国偷自产一区二区开放时间 | 国产蜜臀97一区二区三区| 亚洲精品v日韩精品| 国产精品久久久久影视| 国产日本一区二区| 精品国产91亚洲一区二区三区婷婷 | 精品视频在线免费看| 欧美日韩一区国产| 日韩欧美亚洲另类制服综合在线| 欧美二区乱c少妇| 成人h动漫精品| 亚洲va韩国va欧美va| 欧美mv日韩mv国产网站app| 一区二区三区四区不卡在线| 黄色资源网久久资源365| 久久久国产综合精品女国产盗摄| 久久久久亚洲蜜桃| 韩国理伦片一区二区三区在线播放| 在线不卡中文字幕播放| 狠狠色丁香久久婷婷综合_中| 国产精品每日更新| 欧美精品日日鲁夜夜添| 亚洲成人综合视频| 国产伦精一区二区三区| 色婷婷综合久久久中文一区二区| 欧美高清视频不卡网| 国产精品不卡一区| 国产一区高清在线| 国产精品传媒视频| 婷婷久久综合九色综合绿巨人| 亚洲国产综合在线| 亚洲一区二区欧美日韩| 国产在线一区观看| 欧美色爱综合网| 成人欧美一区二区三区视频网页 | 色综合久久久久综合99| 精品久久久久久亚洲综合网 | 亚洲色图视频免费播放| 精彩视频一区二区三区| 国产乱一区二区| 91精品国产美女浴室洗澡无遮挡| 18成人在线观看| 成人在线视频一区| 中文字幕精品一区二区三区精品| 热久久国产精品| 免费不卡在线视频| 国产一区三区三区| 在线免费精品视频| 国产精品传媒入口麻豆| 色综合久久综合中文综合网| 欧美日韩你懂得| 日韩—二三区免费观看av| 欧美日韩国产成人在线免费| 日韩av一级片| 久久精品一区蜜桃臀影院| 久久成人精品无人区| 欧美激情艳妇裸体舞| 成人毛片老司机大片| 日韩欧美国产成人一区二区| 国产在线麻豆精品观看| 亚洲精品免费看| 一本久道中文字幕精品亚洲嫩| 香蕉久久一区二区不卡无毒影院| 日韩欧美一二三| 99精品国产一区二区三区不卡| 亚洲一区二区在线视频| 国产调教视频一区| 欧美一区二区三区精品| av在线播放成人| 美国三级日本三级久久99| 国产三级三级三级精品8ⅰ区| 91成人免费电影| 成人综合婷婷国产精品久久 | 亚洲五码中文字幕| 激情久久久久久久久久久久久久久久| 中文字幕在线观看不卡| 国产一区二区三区视频在线播放| 日本在线不卡视频| 精品区一区二区| 色婷婷久久综合| 成人免费三级在线| 精品写真视频在线观看 | 国产一区二区视频在线播放| 亚洲国产一区二区三区| 欧美精品久久99| 国产乱码精品一区二区三区av| 五月天精品一区二区三区| 日本不卡的三区四区五区| 久久精品国产精品青草| 91麻豆福利精品推荐| 91精品国产一区二区人妖| 国产精品久久久久久久久果冻传媒| 成人综合在线网站| 91成人看片片| 中文字幕亚洲在| 麻豆国产精品777777在线| 国产成人综合在线| 日韩精品在线网站| 日本vs亚洲vs韩国一区三区二区 | 国产区在线观看成人精品| 婷婷开心久久网| 欧美日韩美少妇| 婷婷国产v国产偷v亚洲高清| 欧美三级一区二区| 三级在线观看一区二区| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 麻豆成人91精品二区三区| 欧美日韩精品一区二区三区 | 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 中文字幕第一区二区| 美洲天堂一区二卡三卡四卡视频| 欧美日韩电影在线播放| 亚洲国产综合91精品麻豆| 欧美专区日韩专区| 亚洲超碰97人人做人人爱| 欧美视频完全免费看| 日韩电影在线看| 精品久久久久久久久久久久久久久久久 | 日韩午夜电影av| 国产精选一区二区三区| 亚洲欧美综合另类在线卡通| 91久久精品午夜一区二区| 亚洲国产中文字幕在线视频综合 | 国产调教视频一区| 日本电影亚洲天堂一区| 奇米精品一区二区三区在线观看一 | 欧美日韩免费一区二区三区视频|