特定条件的Javascript正则表达式验证程序
我需要一个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
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]$/”。但是它不起作用@Michaelre.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标记)*
,因为这是一种可能的收益,不会降低清晰度。