0

我正在为文本框准备正则表达式验证,其中人只能输入 0-9,*,# 每个用逗号分隔且不重复。我准备了这个

if( ( incoming.GET_DTMF_RESPONSE.value.match(/[0-9*#]\d*$/)==null ) )
alert("DTMF WRONG"

其中传入是函数返回,GET_DTMF_RESPONSE 是文本框名称

我不擅长正则表达式..它接受 0-9 和 * 和 # 那很好,但它也接受 az 我希望它制作非重复数字,没有字母,也没有特殊字符,除了 #,*

让我知道如何做到这一点

4

2 回答 2

5

这个正则表达式怎么样

^(?!.*,$|.*\d{2,})(?:([\d*#]),?(?!.*\1))+$

对于以逗号分隔的每个,我将其捕获到 group1 中,然后使用\1(backreference)检查它是否发生在前面


^标记字符串的开始

(?!.*,$|.*\d{2,})是一个前瞻,仅当字符串以两个或多个数字结尾或有两个或多个数字时才会进一步匹配,

(?:([\d*#]),?(?!.*\1))+单个[\d*#]被捕获,group 1然后我们使用 . 检查字符串中是否有任何出现(?!.*\1)\1指第 1 组中的值。对每个这样的值重复此过程,使用+

$标记字符串的结尾


例如

输入

 1,2,4,6,2

(?!.*,$|.*\d{2,})检查字符串是否不以,或有两个或多个数字结尾

上面的前瞻只检查模式但不匹配任何东西。所以我们仍然在字符串的开头

([\d*#])1在第 1 组中捕获

(?!.*\1)检查(不匹配)前面的1任何地方。因为我们没有找到,我们继续前进

由于+我们会再次做同样的事情

([\d*#])现在将2在第 1 组中捕获

(?!.*\1)检查(不匹配)前面的2任何地方。因为我们找到它,我们匹配文本失败


这里工作


但是你最好使用非正则表达式解决方案,因为它会更简单和可维护..

var str="1,2,4,6,6";
str=str.replace(/,/g,"");//replace all , with empty string
var valid=true;
for(var i=0;i<str.length-1;i++)
{
    var temp=str.substr(i+1);
    if(temp.indexOf(str[i])!=-1)valid=false;
}
//valid is true or false depending on input
于 2013-06-26T17:43:29.413 回答
0

你可以使用这个:

^(?:([0-9#*])(?!(?:,.)*,\1)(?:,|$))+$
于 2013-06-26T17:51:00.710 回答