0

我认为这被称为负前瞻/x(?!y)/,但我不确定,因为我今天才开始做正则表达式的东西。我正在尝试验证以下内容:

  // 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} 出现标记就足够了,但是true当有 3 个以上的字母/数字时它仍然会返回(这也是 {n} 标记的意图)。\b因此,如果为字母找到另一个单词,而为数字找到非单词,我尝试了否定前瞻返回 false \B。但这也没有用。

如果我删除负面的前瞻和\b&\B并坚持原来的

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

然后一半的值是有效的,但带有额外字符/数字的值也被认为是有效的。

长话短说:我如何确保发生的事件数量准确 X,并在有额外事件时返回 false?也许我只是搞砸了 NLA 的实施。

4

1 回答 1

2

你让事情变得比他们应该在这里更复杂一些。你可以使用这样的东西:

/^[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}. 大于 1{n}时有用。n

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

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

/\b[a-zA-Z]{2}-[0-9]{2}\b/;
于 2013-09-24T17:17:44.463 回答