2012-11-27 120 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

相关问题