Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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_Validation - Fatal编程技术网

特定条件的Javascript正则表达式验证程序

特定条件的Javascript正则表达式验证程序,javascript,regex,validation,Javascript,Regex,Validation,我需要一个javascript正则表达式验证器,它可以完全满足以下条件 字符串应仅包含字母和空格 第一个字符必须是字母(小写或大写) 空间是允许的,但不是强制性的 空间不应重复。但字符串中可以有多个空格 最后一个字符必须是字母(小写或大写) 提前谢谢 var re = /(([a-zA-Z]+\s*)*[a-zA-Z]+)+/i; var str = 'sample test'; var m; if ((m = re.exec(str)) !== null) { if (m.inde

我需要一个javascript正则表达式验证器,它可以完全满足以下条件

  • 字符串应仅包含字母和空格
  • 第一个字符必须是字母(小写或大写)
  • 空间是允许的,但不是强制性的
  • 空间不应重复。但字符串中可以有多个空格
  • 最后一个字符必须是字母(小写或大写)
  • 提前谢谢

    var re = /(([a-zA-Z]+\s*)*[a-zA-Z]+)+/i; 
    var str = 'sample test';
    var m;
    
    if ((m = re.exec(str)) !== null) {
        if (m.index === re.lastIndex) {
            re.lastIndex++;
        }
        // View your result using the m-variable.
        // eg m[0] etc.
    }
    
    要理解或修改

    您可以尝试以下方法:

    var re = /^(?:[a-zA-Z]+\s)*[a-zA-Z]+$/
    
    re.test('a')     // true
    re.test('ab')    // true
    re.test('a b')   // true
    re.test('a b c') // true
    re.test('a  b')  // false
    re.test('ab ')   // false
    re.test(' ab')   // false
    re.test('ab1')   // false
    

    由于现有答案存在灾难性的回溯问题,或者过于复杂,因此这里有一个更简单的解决方案:

    /^[a-zA-Z]+(?: [a-zA-Z]+)*$/.test(input)
    
    我将
    \s
    更改为一个简单的空格,因为
    \s
    匹配空格、制表符、换行符等字符

    附录 有灾难性的回溯问题:

    /^(?:[a-zA-Z]+\s?)*[a-zA-Z]$/
    
    您可以尝试使用一个简单的失败字符串。例如:

    /^(?:[a-zA-Z]+\s?)*[a-zA-Z]$/.test("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8")
    

    问题是由于可选的
    \s
    ,这导致
    (?:[a-zA-Z]+\s?*)
    退化为
    (?:[a-zA-Z]+)*
    ,这是经典的灾难性回溯模式
    (a*)*

    普通正则表达式。你试过什么?我试过-“/^[a-zA-Z]+[a-zA-Z\s]+[a-zA-Z]$/”。但是它不起作用@Michael
    re.test('ab')//true
    ,正则表达式是复杂的,解决方案比它应该的更复杂。我也是正则表达式的新手,这对我来说是可以理解的。这个解决方案有什么问题吗?@SunilBN:regex格式很差。它不会导致灾难性的回溯,但是在最后添加一点
    $
    会导致问题-所以不要这样显示代码。有关更简单的解决方案,请参见我的答案。另一件事是OP想要验证整个字符串,而不仅仅是匹配字符串。灾难性的回溯:
    /^(?[a-zA-Z]+\s?*[a-zA-Z]$/。测试(“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa。使用
    /^[a-zA-Z]+(?:[a-zA-Z]+)*$/
    instead@nhahtdh抢手货它确实提醒我重新考虑我的答案。删除了不必要的陷阱
    。感谢您的提示。从性能的角度来看,我当前的答案和你的答案之间是否存在差异(除了
    \s
    之外,我将决定权留给OP)?还有其他的方法,比如
    /^(?[a-z]+\s)*[a-z]+$/i
    ,我想它会稍微慢一点,是吗?@Leo:
    token(sep-token)*
    表单在匹配情况下比
    (token-sep)*token
    产生的回溯更少。对于最后一个
    令牌
    ,它总是进入
    (令牌sep)
    ,匹配
    令牌
    ,但不能匹配
    sep
    ,然后它必须回溯并重新匹配
    令牌
    ,因此速度较慢(但它没有灾难性回溯那么重要,在大多数情况下可能无法观察到)。尽管如此,我仍然建议使用
    标记(sep标记)*
    ,因为这是一种可能的收益,不会降低清晰度。