Javascript正则表达式否定预测(验证确切{X}发生次数而不是更多)

问题描述:

我认为它被称为负面预测/x(?!y)/,但我不确定,因为我今天刚开始做正则表达式的东西。我想确认以下内容:Javascript正则表达式否定预测(验证确切{X}发生次数而不是更多)

// Matches aa-00 through ZZ-99 
    var regex = /([a-zA-Z]{2}(?!\b))((-){1})([0-9]{2}(?!\B))/; 

    var result = regex.test("EV-05"); // Should pass 
    Console.log("EV-05: " + result + "\n"); 

    result = regex.test("ev-09"); // Should pass 
    Console.log("ev-09: " + result + "\n"); 

    result = regex.test("eV-11"); // Should pass 
    Console.log("eV-11: " + result + "\n"); 

    result = regex.test("Ev-30"); // Should pass 
    Console.log("Ev-30: " + result + "\n"); 

    result = regex.test("ev03"); // Should fail 
    Console.log("ev03: " + result + "\n"); 

    result = regex.test("e-17"); // Should fail 
    Console.log("e-17: " + result + "\n"); 

    result = regex.test("ev-5"); // Should fail 
    Console.log("ev-5: " + result + "\n"); 

    result = regex.test("evv-36"); // Should fail 
    Console.log("evv-36: " + result + "\n"); 

    result = regex.test("ev-019"); // Should fail 
    Console.log("ev-019: " + result + "\n"); 

    result = regex.test("ev--05"); // Should fail 
    Console.log("ev--05: " + result + "\n"); 

这是我想要的东西:

LETTER#LETTER#HYPHEN#DIGIT#DIGIT(说实话不知道如何来形容,在可读的方式)。

我不希望允许额外值输入任何的5个参数的。它必须正好是2个字母后跟一个连字符,然后是两个数字(0-9)。我想验证没有3个以上的字母,也没有3个以上的数字。

我认为每个{n}出现的标记都足够了,但是当有3个以上的字母/数字时(如{n}标记的意图),它仍然会返回true。因此,如果发现字母为\b,并且数字为非字\B,则我尝试使用否定前瞻返回false。但是那也行不通。

如果我删除负面查找aheads和\b & \B,只是坚持

var regex = /[a-zA-Z]{2}(-){1}[0-9]{2}/; 

随后这些值的一半是有效的,但那些与额外字符/数字也被认为是有效的。

长话短说:我如何保证有正是X量发生什么,当有额外返回false?也许我只是搞乱了NLA的实现。

你正在做的事情有点复杂得多,他们应该在这里。您可以使用这样的事情:

/^[a-zA-Z]{2}-[0-9]{2}$/; 

^将匹配字符串的开头和$将匹配字符串的结尾。

此正则表达式将允许含有2个字母,接着是一个连字符和接着用2个位数只有字符串。您也可以在JavaScript中将[0-9]重写为\d


/([a-zA-Z]{2}(?!\b))((-){1})([0-9]{2}(?!\B))/; 

这并不完全工作,正如您所料。 (?!\b)可防止2个字母后出现字边界,这将使您的有效字符串失效。

((-){1})你并不需要那么多的括号,即使你想组的,因为几乎没有什么组。使用圆括号来捕捉稍后使用的内容。 {1}也是多余的。我从来没有见过{1}的单一具体使用。当n大于1时,{n}是有用的。

([0-9]{2}(?!\B))同样,括号不是很有用,但是在这里,您使用了一个否定字边界,它应该很好地工作(类似于$,但字符串中的任何位置)。

如果你想在一个字符串之间是否匹配这样的格式,那么你可以使用单词边界如下:

/\b[a-zA-Z]{2}-[0-9]{2}\b/; 
+0

@plalx整齐,我从来没有见过'[AZ]'之前一直使用'我'的标志。 – Mathletics

+0

完美!对不起这样一个荒谬的问题,这是我第一次尝试regexing,我只是通过阅读[MDN]上的文档来获得(https://developer.mozilla.org/en-US/docs/Web/的JavaScript /指南/ Regular_Expressions)。直到现在,我还没有真正理解'^'和'$'的含义。尽管工作完美,谢谢:) –

+3

@plalx这将允许更多的字符比[A-ZA-Z],因为它也将匹配字符:[\]^_'(6个额外的字符) – Jerry