如何设置此javascript正则表达式匹配功能?

时间:2010-08-07 17:23:52

标签: javascript regex

我有一个输入文本框,它在keyup事件上运行js函数以匹配有效字符串(域名模式匹配,此处找到正则表达式)。

我写了if语句来测试输入是否是有效模式,然后是超过3个字符长。

显然,我的ifs不像我想要的那样工作。当输入有3个或更多字符时,就可以了。

但是如果输入少于3个字符,则表示模式正则表达式失败。

示例:如果输入框中有“dd”(没有引号),则该函数会在警告输入长度少于3个字符时警告我的模式不正确。

从包含的警告语句中,输入值中没有多余的空格或字符。

<input id="quick" type="text" size="20" onKeyUp="test()"></input>

功能测试是

function test(){

   var liveword = document.getElementById("quick").value;
   var valid = /^[a-zA-Z0-9][a-zA-Z0-9\-\_]+[a-zA-Z0-9]$/;
  alert("xxx"+liveword+"xxx");

    if (liveword.match(valid))
   {
        if (liveword.length < 3)
        {
        alert ('word less than 3');
        }
        else {
    alert ('word more than 3');
            }
     }//outside if

     else {
         alert('enter correct pattern');

     }  

} //close

3 个答案:

答案 0 :(得分:2)

由于您的模式目前正在编写,因此3个字母以下的任何内容都无法匹配。你的正则表达式是“找到任何字母数字,然后是至少一个字母数字或短划线或下划线,然后是最后的字母数字。”

我认为你可能实际上想要一些可选的匹配。用:

var valid = /^[a-zA-Z0-9][a-zA-Z0-9\-\_]*[a-zA-Z0-9]?$/;

即使只有一个字符,您也会匹配任何字母数字。实际上,上述内容与简单地说:

var valid = /^[a-zA-Z0-9][a-zA-Z0-9\-\_]*$/;

请注意,两者仍可能匹配a-之类的内容。如果这不是预期的匹配(即,当使用连字符或破折号时你想要一个终止的字母数字),那么请使用:

var valid = /^[a-zA-Z0-9]([a-zA-Z0-9\-\_]*[a-zA-Z0-9])?$/;

其中说“查找一个字母数字。如果它后面有字符,则可以后跟零个或多个字母数字或连字符或下划线字符,只要最后一个字符是字母数字。”

答案 1 :(得分:1)

你的第一个if是测试模式是否匹配,无论长度如何。如果它是一个很好的匹配,那么你检查长度。如果没有,则提示“输入正确的模式”。

你想这样做:

if( liveword.length < 3 )
    alert( 'too short' )

else
{
    // check patterns, alert good or bad
}

修改

您的代码,重构:

function test(){

    var liveword = document.getElementById("quick").value;
    var valid = /^[a-zA-Z0-9][a-zA-Z0-9\-\_]+[a-zA-Z0-9]$/;
    alert("xxx"+liveword+"xxx");

    if( liveword.length < 3 )
        alert( 'word less than 3' );

    else
    {
        if( liveword.match(valid) )
            alert( 'good match')

        else
            alert( 'bad match' )
    } 

} //close

答案 2 :(得分:0)

如果if (liveword.match(valid))成功,那么这意味着该字长度至少为三个字符,因为正则表达式至少需要三个字符。因此,if (liveword.length < 3)检查将永远不会成功。您需要将其移动到else子句,以便在不匹配

时检查长度:

if (liveword.match(valid)) {
    alert ('word 3 or more');
}
else if (liveword.length < 3) {
    alert ('word less than 3');
}
else {
    alert('enter correct pattern');
}