【问题标题】:regular expression for indian vehicle number in javascript and phpjavascript和php中印度车号的正则表达式
【发布时间】:2010-03-12 11:41:49
【问题描述】:

我需要一个 Javascript 和 PHP 中的正则表达式,用于印度车辆 NUMBER。

这里是条件列表:

(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,从用户名来看:PHP。
  • 您可能需要澄清您的条件。我认为(6)应该读作“b 必须与 y 相同”和(5)“a 必须是一个或两个字母数字后跟一个 alpha”。我从您的测试数据中收集到这一点,这些数据与条件不太相符。
  • @paxdiablo 我已根据您的建议编辑了我的问题..抱歉英语不好
  • 可能您的数据集不涉及这些,但 KL-08 A 2319KL-08 AB 8756 等是印度的有效车辆编号 - 更不用说像 KVK 2087 这样的旧编号系统(基本上是匹配[A-Z]{3} \d{1,4} 也是有效的)。

标签: php javascript regex


【解决方案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)都应该相同。”

【讨论】:

    【解决方案2】:

    你不需要用正则表达式解决每一个问题,你可以很容易地用代码检查它。除了数字 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 听起来两个或三个字符中的 any 都可以是字母,而您的第二个示例表明last 必须是 alpha。

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

    如果例子是正确的,你可以使用:

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

    (如果您需要小写也可以调整)但我仍然认为布局良好的非正则表达式代码更易于维护。

    【讨论】:

    • USING . 也可以接受特殊字符..那是我不想要的
    • @ILikePHP,这并不重要,因为我建议检查(和条件 6)与正则表达式分开。但我会把它们放回去让你开心。然而,这并不能免除您检查这些条件超出正则表达式范围的必要性。
    • @paxdiablo ,是的,你是对的
    【解决方案3】:

    试试:

    <?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
    

    【讨论】:

      猜你喜欢
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      • 2012-02-22
      • 2017-08-07
      • 2016-03-12
      • 1970-01-01
      • 2012-03-03
      相关资源
      最近更新 更多