Javascript正则表达式负前瞻(精确验证{X}次出现次数,而不是更多)

Javascript正则表达式负前瞻(精确验证{X}次出现次数,而不是更多),javascript,regex,validation,negative-lookahead,Javascript,Regex,Validation,Negative Lookahead,我认为这叫做消极前瞻/x(?!y)/,但我不确定,因为我今天才开始做regex的东西。我正在尝试验证以下内容: // 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"); res

我认为这叫做消极前瞻
/x(?!y)/
,但我不确定,因为我今天才开始做regex的东西。我正在尝试验证以下内容:

  // 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个字母,后跟连字符,后跟2个数字(0-9)。我想确认没有3+个字母,也没有3+个数字

我认为每个{n}出现标记就足够了,但是当有3+个字母/数字时,它仍然返回
true
(这是{n}标记的意图)。因此,如果在字母中找到另一个单词
\b
,而在数字中找到非单词
\b
,我尝试使用否定前瞻返回false。但这也不起作用

如果我去掉了负片和
\b
&
\b
,只需坚持原来的

var regex = /[a-zA-Z]{2}(-){1}[0-9]{2}/;
那么,一半的值是有效的,但带有额外字符/数字的值也被认为是有效的


长话短说:我如何确保某个事件的发生量是准确的
X
,如果有额外的事件,则返回false?也许我只是搞乱了NLA的实现。

你把事情弄得有点复杂了。您可以使用以下内容:

/^[a-zA-Z]{2}-[0-9]{2}$/;
^
将匹配字符串的开头,
$
将匹配字符串的结尾

此正则表达式只允许包含两个字母、一个连字符和两个数字的字符串。您可以将
[0-9]
重写为
\d
以及javascript


这并不像你想象的那样有效
(?!\b)
防止在两个字母之后立即出现单词边界,这将导致有效字符串失败

((-){1})
你不需要那么多括号,即使你想把它们分组,因为几乎没有什么东西可以分组。使用括号来捕获稍后将使用的内容。
{1}
也是冗余的。我从未见过
{1}
的任何具体用法<当
n
大于1时,code>{n}非常有用

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

如果要在字符串中的任何位置匹配这种格式,则可以使用单词边界,如下所示:

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

@plalx整洁,我以前从未见过
[A-z]
,并且一直使用
I
标志。完美!很抱歉问了这么一个荒谬的问题,这是我第一次尝试重新登录,我只是通过阅读网站上的文档才做到了这一点。直到现在我才真正理解
^
$
的意思。不过效果很好,谢谢:)@plalx这将允许比[A-Za-z]更多的字符,因为它还将匹配以下字符:[\]^`(6个额外字符)@Mathletics在该范围内要非常小心!请看我上面的评论。@Jerry:如果你对
[A-z]
说的“非常小心”是指“永远不要使用它”,我同意
/\b[a-zA-Z]{2}-[0-9]{2}\b/;