Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 验证单个字符出现的正则表达式_Javascript_Regex - Fatal编程技术网

Javascript 验证单个字符出现的正则表达式

Javascript 验证单个字符出现的正则表达式,javascript,regex,Javascript,Regex,我想检查输入字符串以验证正确的文本。验证将使用javascript完成,现在我使用以下代码: keychar = String.fromCharCode(keynum); var text = txtBox.value + keychar; textcheck = /(?!.*(.)\1{1})^[fenFN,]*$/; return textcheck.test(text); 允许使用的字符串包括: f e f、 e n、 f,e,f,n 不允许的示例: ff fe f、 f f、 ee f

我想检查输入字符串以验证正确的文本。验证将使用javascript完成,现在我使用以下代码:

keychar = String.fromCharCode(keynum);
var text = txtBox.value + keychar;
textcheck = /(?!.*(.)\1{1})^[fenFN,]*$/;
return textcheck.test(text);
允许使用的字符串包括:
f
e
f、 e
n、 f,e,f,n

不允许的示例:
ff
fe
f、 f
f、 ee
f、 e,n,f
n、 ,(尽管这可能还可以)


用Javascript中的正则表达式可以解决这个问题吗?

我认为单用正则表达式无法解决这个问题,因为它们不太擅长在文本中查找重复项。我相信这是可以做到的,但一点也不漂亮

您可能需要逐个字符解析字符串并将当前字符存储在数组中,在解析字符串时,检查该字符是否已被使用,如下所示:

function test_text(string) {
    // split the string into individual pieces
    var arr = string.split(',');
    var used = [];

    // look through the string for duplicates
    var idx;
    for (idx in arr) {
        // check for duplicate letters
        if (used.indexOf(arr[idx])) {
            return false;
        }

        // check for letters that did not have a comma between
        if (1 < arr[idx].length) {
            return false;
        }

        used.push(arr[idx]);
    }

    return true;
}
功能测试\u文本(字符串){
//把绳子分成几段
var arr=string.split(',');
使用的风险值=[];
//在字符串中查找重复项
var-idx;
用于(arr中的idx){
//检查有无重复的信件
if(使用.indexOf(arr[idx])){
返回false;
}
//检查字母之间是否没有逗号
if(1

您可能还希望通过在某个地方包含此脚本来确保运行此脚本的浏览器支持Array.indexOf:

我认为您不能单独使用regexp来完成此操作,因为它们不太擅长在文本中查找重复项。我相信这是可以做到的,但一点也不漂亮

您可能需要逐个字符解析字符串并将当前字符存储在数组中,在解析字符串时,检查该字符是否已被使用,如下所示:

function test_text(string) {
    // split the string into individual pieces
    var arr = string.split(',');
    var used = [];

    // look through the string for duplicates
    var idx;
    for (idx in arr) {
        // check for duplicate letters
        if (used.indexOf(arr[idx])) {
            return false;
        }

        // check for letters that did not have a comma between
        if (1 < arr[idx].length) {
            return false;
        }

        used.push(arr[idx]);
    }

    return true;
}
功能测试\u文本(字符串){
//把绳子分成几段
var arr=string.split(',');
使用的风险值=[];
//在字符串中查找重复项
var-idx;
用于(arr中的idx){
//检查有无重复的信件
if(使用.indexOf(arr[idx])){
返回false;
}
//检查字母之间是否没有逗号
if(1

您可能还希望通过在某处包含此脚本来确保运行此脚本的浏览器支持Array.indexOf:

虽然可以使用正则表达式,但它会生成一个相当大的正则表达式,可能很难理解(因此也很难维护)。我会按照本贾姆的建议选择“手动”选项

但是,使用regex,您可以这样做:

var测试=[
"f",,
"e",,
“f,e”,
‘n,f,e,f,n’,
“ff”,
“fe”,
‘f,f’,
“f,ee”,
‘f,e,n,f’,
“n,,”,
“f,e,e”
];
对于(变量i=0;i'+(t.match(/^([a-zA-Z])(?!*\1)(,([a-zA-Z])(?!*\3))*$/)?“通过”:“失败”);
}
将打印:

f->pass
e->通行证
f、 e->通行证
n、 f,e,f,n->通过
ff->失败
fe->失败
f、 f->失败
f、 ee->失败
f、 e,n,f->失败
n、 ,->失败
f、 e,e->失败
正如你在电视上看到的

一个小小的解释:

^#匹配输入的开头
([a-zA-Z])#匹配单个ascii字母并将其存储在组1中
(?!.*\1)#确保前面没有与第1组中的字符匹配的字符
(#开放组2
,([a-zA-Z])(?!.*\3)#匹配一个逗号,后跟一个不重复的ascii字母(在第3组中)
)*#关闭第2组并重复0次或更多次
$#匹配输入的结尾

尽管可以使用正则表达式,但它会产生一个相当大的正则表达式,可能很难理解(因此也很难维护)。我会按照本贾姆的建议选择“手动”选项

但是,使用regex,您可以这样做:

var测试=[
"f",,
"e",,
“f,e”,
‘n,f,e,f,n’,
“ff”,
“fe”,
‘f,f’,
“f,ee”,
‘f,e,n,f’,
“n,,”,
“f,e,e”
];
对于(变量i=0;i'+(t.match(/^([a-zA-Z])(?!*\1)(,([a-zA-Z])(?!*\3))*$/)?“通过”:“失败”);
}
将打印:

f->pass
e->通行证
f、 e->通行证
n、 f,e,f,n->通过
ff->失败
fe->失败
f、 f->失败
f、 ee->失败
f、 e,n,f->失败
n、 ,->失败
f、 e,e->失败
正如你在电视上看到的

一个小小的解释:

^#匹配输入的开头
([a-zA-Z])#匹配单个ascii字母并将其存储在组1中
(?!.*\1)#确保前面没有与第1组中的字符匹配的字符
(#开放组2
,([a-zA-Z])(?!.*\3)#匹配一个逗号,后跟一个不重复的ascii字母(在第3组中)
)*#关闭第2组并重复0次或更多次
$#匹配输入的结尾

我当然应该在我的问题中包括正则表达式是否是最有效和最简单的方法,或者我是否应该使用if/else或两者的组合:谢谢你的回答。我当然应该在我的问题中包括正则表达式是否是最有效和最简单的方法,或者我是否应该使用if/else或两者的组合:谢谢你的回答。正则表达式+1。为了它的刺激,我会选择regex,尤其是完成它的刺激。虽然像你说的,维护可以站在way@mcnemesis,您知道(在)著名的提示“始终编写代码,就好像维护您代码的人是一个疯狂的连环杀手知道您住在哪里”,对吗?:)您需要将第二个反向引用更改为
\3
,否则类似
f,e,e
的内容将通过(因为您引用的是
f
而不是
e
)。+1