如何制作这个简单的正则表达式?

时间:2011-07-22 05:24:54

标签: javascript regex

我需要创建一个字符串的开头和结尾,字母数字范围介于5到20个字符之间,字符之间可能有空格或没有空格。 /^[a-z\s?A-Z0-9]{5,20}$/但这不起作用。

修改
测试测试 - 应该通过
测试 - 应该通过
测试测试 - 不应该通过

3 个答案:

答案 0 :(得分:6)

如果不编写一个可笑的长表达式,你不能用传统的正则表达式做到这一点,所以你需要使用前瞻:

/^(?=(\w| ){15,20}$)\w+ ?\w+$/

这说明,确保匹配中有15到20个字符,然后匹配/\w+ \w+/

注意我使用\ w进行简化。它与上面的角色类相同,除了它也接受下划线。如果你不想匹配它们,你必须这样做:

/^(?=[a-zA-Z0-9 ]{15,20}$)[a-zA-Z0-9]+ ?[a-zA-Z0-9]+$/

答案 1 :(得分:2)

您无法在?内加[...][...]用于精确指定一组字符,您不能(?)在一组字符中包含一个字符。任何特定字符的出现都是可选的,?毫无意义。

如果您在匹配中允许任意数量的空格,只需删除问号即可。如果你想允许一个空格而不是更多空间,那么单独的正则表达式不能为你做那些,你需要像

这样的东西
if (myString.match(/^[a-z\sA-Z0-9]{5,20}$/ && myString.match(/\s/g).length <= 1)

你不能用一个传统的正则表达式做到这一点,而不是几十行;正则表达式用于匹配比这更简单的模式。

如果您只想使用正则表达式,则可以使用两个而不是一个。第一个匹配一般模式,第二个确保只找到一个非空格字符。

if (myString.match(/^[a-z\sA-Z0-9]{5,20}$/ && myString.match(/^[^\s]*\s?[^\s]*$/))) {

使用示例

inputs = ["test test", "testtest", "test test test"];

for (index in inputs) {
    var myString = inputs[index];
    if (myString.match(/^[a-z\sA-Z0-9]{5,20}$/ && myString.match(/^[^\s]*\s?[^\s]*$/))) {
        console.log(myString + " matches.")
    } else {
        console.log(myString + " does not match.")
    }
}

这会产生问题中指定的输出。

答案 2 :(得分:-1)

嗯,所以这里是相同的长期传统的正则表达式

(?i)[a-z0-9]+( [a-z0-9]+)?{5,12}

js vesrion(没有嵌套量词)

/^([a-z0-9]( [a-z0-9])?){5,12}$/i