javascript正则表达式(词尾)

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

我觉得正则表达式有问题: 我想要一个字符串,它可以包含第一个圆括号中的所有字符,最后是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
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-]*\])?$/

我看不到任何可能的方法让你的程序循环使用这段代码。我知道没有循环,但程序停止请提供一个演示你的问题的方法。这是一个很好的工具。我不知道如何使用这个工具。。。我试着。。。