javascript正则表达式(词尾)
我觉得正则表达式有问题: 我想要一个字符串,它可以包含第一个圆括号中的所有字符,最后是a[最后是a]。 正则表达式如下所示:javascript正则表达式(词尾),javascript,regex,Javascript,Regex,我觉得正则表达式有问题: 我想要一个字符串,它可以包含第一个圆括号中的所有字符,最后是a[最后是a]。 正则表达式如下所示: 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?)*\]?)+$/; //the alert doesn't works ale
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?)*\]?)+$/;
//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;
}
问题是如果我尝试测试以下字符串Maionese[dfvdfv]@
我的程序将永远循环:-|
我用来测试的功能如下:
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?)*\]?)+$/;
//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;
}
因为您有嵌套的量词((…)*)+
),所以您会遇到,当主题字符串无法匹配时,由此产生的组合爆炸将炸毁您的正则表达式引擎
现在,如何解决这个问题?让我们首先简化正则表达式。其中有很多令人恼火的错误-以下正则表达式与您的字符串完全匹配,但更容易阅读:
/^(([\w\s.,()\\\/'\xE0\xE8\xE9\xF9\xF2\xEC\x27-])*\[?([\w\s.,()\\\/'\xE0\xE8\xE9\xF9\xF2\xEC\x27-])*\]?)+$/
问题现在变得清楚了:[]
都是可选的,测试字符串中的@
不在允许的字符范围内。这意味着在遇到@
时,正则表达式引擎需要回溯到匹配中,并检查是否有其他方法匹配前面的部分,并且有很多方法需要尝试
根据您的规范,您根本不需要最终的+
,因为您似乎想要匹配一个包含任何允许的字符的字符串,再加上一个可选的,[…]
结尾包含相同字符的字符串。在这种情况下,使用
/^([\w\s.,()\\\/'\xE0\xE8\xE9\xF9\xF2\xEC\x27-]*)(\[[\w\s.,()\\\/'\xE0\xE8\xE9\xF9\xF2\xEC\x27-]*\])?$/
我看不到任何可能的方法让你的程序循环使用这段代码。我知道没有循环,但程序停止请提供一个演示你的问题的方法。这是一个很好的工具。我不知道如何使用这个工具。。。我试着。。。