JavaScript和PHP中用于印度车牌号的正则表达式

3
我需要一个在JavaScript和PHP中用于印度车牌号的正则表达式。
以下是条件列表:
(x)(y)(z)(m)(a)(b)(c)

1. (x) 只包含长度为2的字母。
2. (y) 可能是 - 或单个空格 ' '
3. (z) 只包含长度为2的数字。
4. (m) 可能是 , 或单个空格 ' '
5. (a) 必须是一个或两个字母数字,后跟一个字母。
6. (b) 必须与 (y) 相同。
7. (c) 只包含长度为4的数字。

以下是一些有效车牌号码的示例:

  • RJ-14,NL-1234
  • RJ-01,4M-5874
  • RJ-07,14M-2345
  • RJ 07,3M 2345
  • RJ-07,3M-8888
  • RJ 07 4M 2345
  • RJ 07,4M 2933

以及一些无效的车牌号码(原因):

  • RJ-07 3M 1234 ((y) 和 (b) 应该相同)。
  • RJ-07 M3-1234 ((a) 必须以字母结尾)。
  • rj-07 3M-123 ((c) 的长度必须为4)。

用什么编程语言? - Timothy Khouri
5
根据用户名“PHP”,可以判断用户可能使用的是PHP编程语言。 - Mark Byers
1
你可能需要澄清你的条件。我认为(6)应该是“b必须与y相同”,而(5)则是“a必须是一个或两个字母数字,后跟一个字母”。我从你的测试数据中推断出这一点,它与条件不太吻合。 - paxdiablo
@paxdiablo 我已根据您的建议编辑了我的问题。抱歉我的英语不好。 - xkeshav
也许你的数据集中没有这些,但是 KL-08 A 2319KL-08 AB 8756 等都是印度有效的车牌号码,更不用说旧的编号系统,例如 KVK 2087(基本上与 [A-Z]{3} \d{1,4} 匹配的任何内容都是有效的)。 - Amarghosh
@Amarghosh 你说得对。那么告诉我我需要应用哪种类型的验证?最少2个字母和字符串的总长度。 - xkeshav
3个回答

1

这是正则表达式...在大多数/所有语言中应该是安全的:

([a-z]{2}-\d{2}[ ,][a-z0-9]{1,2}[a-z]-\d{4})|([a-z]{2} \d{2}[ ,][a-z0-9]{1,2}[a-z] \d{4})

我将正则表达式重复两次并在中间加上“或”是为了满足您的标准,即“(y)和(b)都应该相同。”


1

你不需要用正则表达式解决每一个问题,你可以用代码轻松检查它。除了第5个之外,其他问题都很容易,所以你可以使用:

^[A-Z]{2}[ \-][0-9]{2}[ ,][A-Z0-9]{2,3}[ \-][0-9]{4}$

然后检查第7和8个字符(如果总长度为14而不是13,则还要检查第9个字符)是否符合条件5。还要检查位置3和7是否相同。

检查旧样式的代码很可能比使用正则表达式完成相同任务更易读(并且易于维护)。


重新阅读问题后,在条件5和6中似乎存在混淆。条件5使人们觉得两个或三个字符中的任何一个都可以是字母,而您的第二个示例表明最后一个必须是字母。

条件6使用单词“相似”表示条件类似,而您的第一个示例表明字符必须相同

如果这些示例是正确的,则可以使用:

^[A-Z]{2}([ \-])[0-9]{2}[ ,][A-Z0-9]{1,2}[A-Z]\1[0-9]{4}$

(如果需要小写字母,请进行调整)但我仍然坚持认为,良好布局的非正则表达式代码更易于维护。

使用 . 可以接受特殊字符,但我不想这样。 - xkeshav
@ILikePHP,这并不重要,因为我建议检查它(和条件6)与正则表达式分开。但是我会把它们放回去让你高兴。然而,这并不免除您在正则表达式范围之外检查这些条件的必要性。 - paxdiablo
@paxdiablo,是的,你说得对,正则表达式有时真的很难搞,我已经改变了用RE的想法。 - xkeshav

0

尝试:

<?php
$arr = array("RJ-14,NL-1234", "RJ-01,4M-5874", "RJ-07,14M-2345", "RJ 07,3M 2345", "RJ-07,3M-8888", "RJ 07 4M 2345", "RJ 07,4M 2933","RJ-07 3M 1234","RJ-07 M3-1234","rj-07 M3-123");

foreach($arr as $str) {
    if(preg_match('/[a-z]{2}( |-)\d{2}(?: |,)(?:[a-z\d]{1,2}[a-z])\1\d{4}/i',$str))
        print "$str\tYES\n";
    else
        print "$str\tNO\n";
}

?>

输出:

RJ-14,NL-1234   YES
RJ-01,4M-5874   YES
RJ-07,14M-2345  YES
RJ 07,3M 2345   YES
RJ-07,3M-8888   YES
RJ 07 4M 2345   YES
RJ 07,4M 2933   YES
RJ-07 3M 1234   NO
RJ-07 M3-1234   NO
rj-07 M3-123    NO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接