سبق Regular Expression | Number Validation

محمداحمد

لائبریرین
VALIDATING A PHONE NUMBER
USING REGULAR EXPRESSION
فون نمبر کی جانچ بذریعہ ریگولر ایکسپریشن

اب ریگولر ایکسپریشن کی مدد سے ہم ایک فون (موبائل) نمبر کی جانچ پڑتال کریں گے کہ آیا یہ ایک درست فون نمبر ہے یا نہیں۔

فون (موبائل) نمبر کے لئے ہمارے پاس جو فارمیٹ (معیار) ہے وہ کچھ اس طرح ہے۔
PHP:
>>> # phone format xxxx xxx xxxx

رائج معیار کے مطابق ہمارے فون (موبائل) نمبر میں کل 11 ہندسے ہوں گے۔ جس میں پہلے چار ہندسے، پھر تین ہندسے اور پھرچار ہندسے ہوں گے۔ یعنی ہمیں ایک ایسا عبارتی نمونہ چاہیے جو صرف 11 ہندسوں کے نمبر کو قبول کرے اور اس سے کم یا زیادہ ہندسوں والے نمبر کو مسترد کردے۔

فرض کیجے کسی ڈیٹا میں ہمیں درج ذیل فون نمبرز ملتے ہیں۔
PHP:
>>> phone1 = '0333 333 3333'
>>> phone2 = '0333 333 333'
>>> phone3 = '033 2333 333'

اب مندرجہ ذیل کوڈ دیکھیے۔ یہاں بھی ہم نے اپنے پہلے سے بنے ہوئے فنکشن اور پائتھون ریگولر ایکسپریشن کی مدد سے اپنا مطلوبہ کام کرنے کی کوشش کی ہے۔
PHP:
>>> find_re(r'^(\d{4} \d{3} \d{4})$',phone1)
Pattern found
>>> find_re(r'^(\d{4} \d{3} \d{4})$',phone2)
Nothing found
>>> find_re(r'^(\d{4} \d{3} \d{4})$',phone3)
Nothing found

پہلے عبارتی نمونے (Text Pattern) کو سمجھ لیتے ہیں۔ پچھلی مثالوں کی طرح ہم نے یہاں \d کا استعمال کیا ہے اور لہرئیے دار قوسین (Squiggly Brackets) میں موجود ہندسہ مطلوبہ ہندسوں کی تعداد متعین کرتا ہے۔ سادے لفظوں میں ہمارا عبارتی نمونہ یہ کہتا ہے کہ ہمارے نمبر فارمیٹ میں سب سے پہلے 4 ہندسے ہوں گے پھر ایک اسپیس، اس کے بعد 3 ہندسے پھر ایک اسپیس، اور اس کے بعد 4 ہندسے۔ اس طرح کل ملا کر 11 ہندسے ایک مخصوص حساب سے ہو جائیں گے۔

چونکہ صرف phone1 ہی دیئے گئے معیار (Standard) پر پورا اُترتا ہے، اس لئے ہمیں اس کی جانچ کے نتیجے میں pattern found کی نوید ملی۔ جبکہ phone2 میں کل 10 ہندسے ہیں اور phone3 میں بھی 10 ہی ہندسے ہیں اور اس کی ترتیب بھی مختلف ہے۔ سو یہ دونوں ہی معیار (Standard) کے مطابق نہیں ہیں۔ اس لئے اُن دونوں نمبرز کی جانچ پر ہمیں مثبت نتائج نہیں مل سکے۔

*****

PHONE NUMBERS WITH DASH

اب فرض کیجے کہ ہمیں دستیاب ڈیٹا میں کچھ نمبر ایسے بھی ہیں جو یوں تو درست ہیں لیکن اُن کے اجزا کے مابین ڈیٹا فیڈ کرنے والے نے ڈیش (۔) لگا دیئے ہیں۔

ایسے نمبر کی مثال دیکھیے۔
PHP:
>>> phone4 = '0333-333-3333'

اب ہم اس نمبر کو اپنے تیار شدہ عبارتی نمونے (Text Pattern) کی مدد سے جانچتے ہیں۔
PHP:
>>> find_re(r'^(\d{4} \d{3} \d{4})$',phone4)
Nothing found

چونکہ ہمارے پیٹرن میں نمبر کے اجزا کے مابین "اسپیس کیرکٹرز" دئے گئے ہیں اس لئے اس میں اسپیس کے علاوہ کسی اور کیرکٹر کی گنجائش نہیں ہے۔نتجتاً ہمیں اس کا جواب مثبت نہیں ملا۔ حالانکہ یہ ایک درست (valid) نمبر ہے۔

اب ہمیں اپنے عبارتی نمونے (Text Pattern) میں ایسی تبدیلی کرنی ہے کہ یہ ڈیش (۔) والے درست نمبرز کو بھی قبول کرے۔

یہ کوڈ دیکھیے:
PHP:
>>> phone4 = '0333-333-3333'
>>> find_re(r'^(\d{4}\D\d{3}\D\d{4})$',phone4)
Pattern found

اب ہم نے اپنے عبارتی نمونے (Text Pattern) میں اسپیس کی جگہ \D شامل کیا ہے۔ جس سے مراد ہندسوں کے علاوہ کوئی بھی کیرکٹر ہے۔ اس معمولی تبدیلی سے اب ہمارا عبارتی نمونہ (Text Pattern) اس قابل ہوگیا کہ ڈیش (۔) والے نمبرز کی شناخت کر سکے۔

*****
PHONE NUMBER WITHOUT SPACE OR DASH

اب فرض کیجے کہ فون نمبرز کا ڈیٹا فیڈ کرنے والے نے تو فون نمبر کے مختلف اجزاء کے درمیان نہ تو کوئی اسپیس دیا اور نہ ہی کوئی ڈیش (۔) وغیرہ، تاہم نمبر پھر بھی درست (valid) ہے۔
PHP:
>>> phone5 = '03333333333'
>>> find_re(r'^(\d{4}\D\d{3}\D\d{4})$',phone5)
Nothing found

چونکہ ہمارے عبارتی نمونے (Text Pattern) میں اس طرح کے کسی نمبر (جس میں کوئی اسپیس وغیرہ نہ ہو) کا تصور نہیں ہے۔ سو فون نمبر درست (valid) ہونے کے باوجود مثبت جواب نہیں مل سکا۔ یعنی اب ہمارے عبارتی نمونے (Text Pattern) کچھ اس قسم کی تبدیلی درکار ہے کہ اس قسم کا نمبر بھی درست قرار پائے۔

نیچے دیے گئے کوڈ میں اس مسئلے کا حل موجود ہے۔
PHP:
>>> phone5 = '03333333333'
 
>>> find_re(r'^(\d{4}\D*\d{3}\D*\d{4})$',phone5)
Pattern found
>>>

یہ عبارتی نمونہ (Text Pattern) بھی پہلے والے کی طرح ہی ہے سوائے ایک تبدیلی کے۔ اب ہم نے فون کے اجزاء کے مابین موجود \D کے ساتھ ایک عدد * کا اضافہ کر دیا ہے اور اب یہ کچھ ایسا \D* لگ رہا ہے۔ اگر ہم اوپر موجود ریگولر ایکسپریشن کی علامات کا چارٹ دیکھیں تو ہمیں پتہ چلے گا کہ اسٹیرک (*) سائن کسی بھی جز کی 0 یا اُس سے زائد بار موجودگی کے لئے استعمال ہوتا ہے۔

یعنی اب ہمارے ٹیکسٹ میں اسپیس یا ڈیش وغیرہ ہوں تو بھی وہ قابلِ قبول ہے اور نہ ہوں تو بھی۔

*****
PHONE NUMBER WITH + AND COUNTRY CODE


اب ایک اور مسئلہ آن کھڑا ہوا ہے۔ ہوا یوں کہ ڈیٹا فیڈ کرنے والے صاحب نے فون نمبرز کے ساتھ ساتھ کنڑی کوڈ (Country Code) اور + کی علامت بھی لگا دی ہے۔ یعنی یہ ایک ایسا نمبر ہے جسے دنیا میں کہیں سے بھی ملایا جا سکتا ہے۔

ہم اس نمبر کو اپنے موجودہ عبارتی نمونے (Text Pattern) کی مدد سے جانچنے کی کوشش کرتے ہیں۔
PHP:
>>> phone6 = '+92333-333-3333'
>>> find_re(r'^(\d{4}\D*\d{3}\D*\d{4})$',phone6)
Nothing found


چونکہ ہمارے عبارتی نمونے میں کنٹری کوڈ اور + کی علامت کی کوئی گنجائش نہیں ہے۔ سو نمبر درست (valid) ہونے کے باوجود بھی ریگولر ایکسپریشن اس نمبر کو بطورِ درست نمبر شناخت نہیں کر پایا۔ اس مسئلے کے حل کے لئے ہم نے اپنے عبارتی نمونے (Text Pattern) میں کچھ اور تبدیلیاں کی ہیں۔

PHP:
>>> phone6 = '+92333-333-3333'
>>> find_re(r'^(\d{4}\D*\d{3}\D*\d{4})$',phone6)
Nothing found
>>> find_re(r'^\D(\d{2})?(\d{3,4})\D*(\d{3})\D*(\d{4})$',phone6)
Pattern found
>>>

اب ہمارے عبارتی نمونے میں نیچے دیے گئے کوڈ کا اضافہ کیا گیا ہے۔

یعنی سب سے پہلے ایک \D ۔ جس سے مراد ہندسوں کے علاوہ کوئی بھی کیرکٹر ہے۔ جو ہمارے نمبر میں + کی علامت کے لئے قبول کرے گا۔
پھر (\d{2}) ہے جو 2 عدد ہندسوں کے لئے ہے۔ ہماری مثال میں یہ دو ہندسے 92 ہیں۔
اور پھر ایک سوالیہ نشان، جس سے مراد یہ ہے کہ سوالیہ نشان سے پیشتر بریکٹ میں دیا گیا تمام کوڈ اختیاری ہے۔ یعنی اس کا نمونہ مل تو بھی ٹھیک ہے اور نہ بھی ملے تو بھی ٹھیک ہے۔

یعنی اب کوئی کنٹری کوڈ لکھے تو بھی وہ قابلِ قبول ہے اور نہ لکھے تو بھی کوئی بات نہیں۔


*****
PHONE NUMBER WITH 00 INSTEAD OF + AND COUNTRY CODE


اب ایک آخری تکلیف۔ :) فرض کیجے کہ فون نمبرز کا اندراج کرنے والے صاحب + کی علامت کے بجائے 00 لکھتے ہیں۔ یعنی ہمارا عبارتی نمونہ (Text Pattern) ایک بار پھر ناکارہ ہو گیا۔

اس طرح کے نمبر کو اپنے عبارتی نمونے کے ذریعے جانچ کر دیکھتے ہیں۔
PHP:
>>> phone7 = '0092333-333-3333'
>>> find_re(r'^\D(\d{2})?(\d{3,4})\D*(\d{3})\D*(\d{4})$',phone7)
Nothing found

نتیجہ حسبِ توقع ہی ہے۔ یعنی مزید کچھ تبدیلی درکار ہے۔

اب ہم اپنے عبارتی نمونے (Text Pattern) کے ابتدائی ٹکڑے
کو کچھ یوں
کر دیتے ہیں۔

یعنی اب \D کے ساتھ بھی ایک * لگا دیا گیا ہے یعنی یہ بھی اب اختیاری (Optional) ہو گیا ہے، یعنی + سائن ہو تو بھی ٹھیک ہے اور نہ ہو تو بھی ٹھیک۔
دوسرے نمبر پر یہ کام کیا گیا ہے کہ d\ کے ساتھ لہرئے دار قوسین (Squiggly Brackets) میں 2 کو تبدیل کر کے {2,4} کردیا گیا ہے۔ یعنی اب فون نمبر سے پہلے کنٹری کوڈ صرف 2 ہندسوں کا بھی دیا جا سکتا ہے۔ مثلاً 92 اور 00 مزید لگا کر کنٹری کوڈ 4 ہندسوں کا بھی ہو سکتا ہے۔ مثلاً 0092۔

اب دیکھتے ہیں:
PHP:
>>> phone7 = '0092333-333-3333'
 
>>> find_re(r'^\D*(\d{2,4})?\D*(\d{3,4})\D*(\d{3})\D*(\d{4})$',phone7)
Pattern found
عبارتی نمونے (Text Pattern) میں کی جانے والی آخری تبدیلی کے بعد ہم چار ہندسوں والے کنٹری کوڈ کے ساتھ دیا گیا نمبر بھی شناخت (Recognize) کر سکتے ہیں۔

*****
VALIDATING CORRECT NUMBERS


لیجے جناب فون (موبائل) نمبر کی جانچ کے لئے ہمارا عبارتی نمونہ (Text Pattern) اب ہماری ضروریات کے لئے کافی ہو گیا ہے۔ اب ہم پچھلے تمام استعمال کئے ہوئے درست (valid) نمبر اپنے آخری عبارتی نمونے (Text Pattern) کے ذریعے جانچتے ہیں۔

PHP:
>>> phone1 = '0333 333 3333'
>>> phone4 = '0333-333-3333'
>>> phone5 = '03333333333'
>>> phone6 = '+92333-333-3333'
>>> phone7 = '0092333-333-3333'
>>> find_re(r'^\D*(\d{2,4})?\D*(\d{3,4})\D*(\d{3})\D*(\d{4})$',phone1)
Pattern found
>>> find_re(r'^\D*(\d{2,4})?\D*(\d{3,4})\D*(\d{3})\D*(\d{4})$',phone4)
Pattern found
>>> find_re(r'^\D*(\d{2,4})?\D*(\d{3,4})\D*(\d{3})\D*(\d{4})$',phone5)
Pattern found
>>> find_re(r'^\D*(\d{2,4})?\D*(\d{3,4})\D*(\d{3})\D*(\d{4})$',phone6)
Pattern found
>>> find_re(r'^\D*(\d{2,4})?\D*(\d{3,4})\D*(\d{3})\D*(\d{4})$',phone7)
Pattern found
>>>

لیجے جناب 100 فی صد نتیجہ حاصل ہو گیا۔

نوٹ: phone2 اور phone3 میں موجود نمبرز رائج معیار (Standard) کے حساب سے ٹھیک نہیں تھے۔ اس لئے اس موقع پر ان کی جانچ ضروری نہیں سمجھی گئی۔
 
Top