2012-11-27 116 views
2

我認爲我有一個正則表達式的問題: 我想要一個字符串,它可以包含第一個圓括號中的所有字符串,最後是[最後一個]。 正則表達式如下:javascript正則表達式(字的結尾)

var pattern = /^(([a-zA-Z0-9\.\_\-\(\)\\'\xE0\xE8\xE9\xF9\xF2\xEC\x27\,\/]\s?)*\[?([a-zA-Z0-9\.\_\-\(\)\\'\xE0\xE8\xE9\xF9\xF2\xEC\x27\,\/]\s?)*\]?)+$/; 

的問題是,如果我嘗試測試以下字符串Maionese [dfvdfv] // @ 我的程序將永遠循環下去: - |

我用來測試的功能如下:

//the alert doesn't works 
alert(checkSpecialIngredienti("Maionese [dfvdfv]@")); 
function checkSpecialIngredienti(s) { 

var pattern = /^(([a-zA-Z0-9\.\_\-\(\)\\'\xE0\xE8\xE9\xF9\xF2\xEC\x27\,\/]\s?)*\[?([a-zA-Z0-9\.\_\-\(\)\\'\xE0\xE8\xE9\xF9\xF2\xEC\x27\,\/]\s?)*\]?)+$/; 
if (!pattern.test(s)) { 
    alert("Attenzione, il campo "+s+"" + 
      " che hai inserito non va bene!" + 
      "\nIn questo campo puoi inserire " + 
      "lettere, numeri, lettere accentate," + 
      "punteggiatura classica, singoli spazi e" + 
      "\nuna sola coppia di parentesi quadre." + 
      "\nRiprova!"); 
    return (false); 
} else 
    return true; 
} 
+0

我沒有看到任何可能的方式讓您的程序循環使用此代碼。 –

+0

我知道沒有循環,但程序停止。 – Martina

+0

請提供一個[簡短自包含的正確示例](http://sscce.org)來說明您的問題。 [JSFiddle](http://jsfiddle.net)是一個很棒的工具。 –

回答

2

您正在運行到catastrophic backtracking,因爲你嵌套量詞(((...)*)+),並將得到的組合爆炸會炸掉你的正則表達式引擎當主題字符串不能匹配。

現在,如何解決這個問題?我們首先簡化你的正則表達式。那裏面有很多刺激的cruft - 以下的正則表達式完全相同的字符串作爲你的比賽,但它更容易閱讀:

/^(([\w\s.,()\\\/'\xE0\xE8\xE9\xF9\xF2\xEC\x27-])*\[?([\w\s.,()\\\/'\xE0\xE8\xE9\xF9\xF2\xEC\x27-])*\]?)+$/ 

現在的問題變得清晰:在[] s爲兩種可選,而在@您的測試字符串不是允許的字符範圍的一部分。這意味着在遇到@時,正則表達式引擎需要回溯到匹配中,並檢查是否有其他方式來匹配前一部分 - 並且有很多方法需要嘗試。

根據您的規格,你不需要最終+可言,因爲你似乎想匹配包含任何允許的字符加上一個可選的,在同一人物的[...] -enclosed串一串結束。在這種情況下,使用

/^([\w\s.,()\\\/'\xE0\xE8\xE9\xF9\xF2\xEC\x27-]*)(\[[\w\s.,()\\\/'\xE0\xE8\xE9\xF9\xF2\xEC\x27-]*\])?$/ 
+0

謝謝!我對正則表達式很虛僞! – Martina

相關問題