views:

262

answers:

3

I need a regular expression in Javascript, as well as in PHP, for Indian vehicle NUMBER.

Here is the conditions list:

(x)(y)(z)(m)(a)(b)(c)

1. (x) contains only alphabets of length 2.
2. (y) may be - or single space ' '.
3. (z) contains only numbers of length 2.
4. (m) may be or , or single space ' '.
5. (a) must be one or two alphanumeric followed by an alpha.
6. (b) must be identical to (y).
7. (c) contains only numbers of length 4.

Here are some examples of valid vehicle numbers:

  • 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

and some invalid ones (with reason):

  • RJ-07 3M 1234 (both (y) and (b) should be same).
  • RJ-07 M3-1234 ((a) must ends with alphabet).
  • rj-07 3M-123 (length of (c) must be 4).
+1  A: 

Here's the regex... this should be safe in most/all langauges:

([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})

The reason why I have the regex repeated twice with an "or" in the middle is to meet your criteria that "both (y) and (b) should be same."

Timothy Khouri
+1  A: 

You don't need to solve every problem with a regular expression, you can quite easily check it with code. All but number 5 are easy, so you could use:

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

then check characters 7 and 8 (and 9 if the total length is 14 rather than 13) for condition number 5. And also check the positions 3 and 7 are identical.

The code needed to check this old style is likely to be much more readable (and maintainable) than a regular expression to do the same thing.


On re-reading the question, there appears to be confusion in conditions 5 and 6. Condition 5 makes it sound like any of the two or three characters can be alpha whereas your second example indicates the last must be alpha.

Condition 6 use of the word similar indicates the condition is similar whereas your first example indicates the characters must be identical.

If the examples are correct, you can use:

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

(adjusting if you need lower case as well) but I still maintain that well laid out non-regex code is more maintainable.

paxdiablo
+1 for pointing out regular expression overkill
pinaki
USING `.` can accept special character also..that's i don't want
diEcho
@ILikePHP, that doesn't really matter since I'm suggesting the check for that (and condition 6) are separate from the regular expression. But I'll put them back in to keep you happy. That doesn't absolve you of the necessity to check those conditions outsise the scope of the regular expression however.
paxdiablo
@ paxdiablo , yes you are right Regular expression really kills sometime, i have changed the idea to do it with RE
diEcho
A: 

Try:

<?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";
}

?>

Output:

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
codaddict