சனி, ஜூலை 07, 2007

ஒரு வேற்று மொழியில் சில வெளிப்பாடுகள்

^\$[0-9]+(\.00)?$ - இதைப் பார்த்தால் என்னவெல்லாமோ தோன்றலாம். ஆனால் இது பயப்படும்படியான விஷயமல்ல. சொல்லப்போனால் இது ஒரு விருப்பத்தின் வெளிப்பாடாகும். அதாவது, ஒரு ஆவணத்தில் எங்கெல்லாம் (டாலர்களில்) பணம் குறிப்பிடப்பட்டிருக்குன்னு தேடி நமக்குச் சொல்லுவதற்குத்தான் இப்படி ஒரு வெளிப்பாடு (expression). இது எவ்வகையான வெளிப்பாடு என்று யோசனையில் மூழ்குவதற்கு முன் நானே கூறிவிடுகிறேன். இவை regular expressions அல்லது சுருக்கமாக regex எனப்படுபவை.

இதே மாதிரி இன்னொரு regexஐப் பார்க்கலாம்:
^(http://)?.*(blog|wordpress|typepad|livejournal).*$ - இதைப் பார்த்தா ஏதோ வலைப்பதிவுகள் சம்மந்தப்பட்டதுன்னு புரிஞ்சிருக்கும். ஒரு பக்கத்தில் இருக்கும் எல்லா வலைப்பதிவு முகவரிகளையும் தேடிக் குடுக்கத்தான் இந்த regex. குறிப்பிட்ட பதிவு / தளத்தில் எந்தெந்த வலைப்பதிவுகளுக்கெல்லாம் இணைப்பு கொடுக்கப்பட்டுள்ளதுன்னு தேட விரும்பினா இதை பயன்படுத்தலாம்.

இதப் பாருங்க: .*[;:]-?[)\*pD]$ இது என்னவா இருக்கும்ன்னு நினைக்கறீங்க? இதை வச்சி உங்களுக்கு வந்த ஒரு மடலில் அதை அனுப்பியவர் என்னல்லாம் சொல்லி உங்க கிட்ட வழிஞ்சிருக்காருன்னு தெரிஞ்சிக்கலாம் ;) (இதோ, இந்த மாதிரிதான்)

இப்படி, சிக்கலான வேலைகளையும் சுருக்கமான குறிப்புகளைக் கொண்டு சாதிக்கும் ஆற்றல் படைத்தவை இந்த regexகள். அவற்றின் புரியாத மொழியை எப்படி புரிஞ்சிக்கிறது?

அ, ஆ, இ, ஈ, யிலிருந்து ஆரம்பிக்க வேண்டியதுதான். அவற்றுடைய எழுத்துக்கள் இவைதான்:
^ - ஒரு பொருளின் தொடக்கம் (இதில் பொருள் என்பது இடத்திற்குத் தகுந்தாற்போல் சொல் / வாக்கியம் / பத்தி இப்படி எதுவாக வேண்டுமானாலும் இருக்கலாம்) . உ-ம். ^தமிழ் - தமிழ் என்று தொடங்கும் அனைத்துப் பொருட்களையும் குறிக்கும்.

$ - ஒரு பொருளின் முடிவு. உ-ம். வடை$ - வடை என்று முடியும் அனைத்து பொருட்களையும் குறிக்கும் (இட்லிவடை, சட்னிவடை, etc.)

. - எந்த ஒரு குறியீடாகவும் இருக்கலாம்
உ-ம். ப.ம் எனபது பணம் என்பதற்கும் பொருந்தும், பலம் / பதம் என்பவற்றுக்கும் பொருந்தும். பயணம் என்பதற்குப் பொருந்தாது, ஏன் என்பதை ஊகித்துக் கொள்ளவும்.

* - இதற்கு முன் இடம்பெறும் குறியீடு ஒரு முறையும் வராமலிருக்கலாம் அல்லது , ஒரு முறையோ பலமுறைகளோ கூட வரலாம்.
உ-ம். க.*னி. இதற்குப் பொருந்தக் கூடிய சொற்கள் 'கனி' (ஒரு குறியீடு கூட இல்லாதிருக்கலாம் அல்லவா?), கணினி (நடுவில் ஒரு குறியீடு), கவிதாயினி (நடுவில் பல குறியீடுகள்)

+ - இதற்கு முன் இடம் பெறும் குறியீடு ஒரு முறையோ அல்லது அதற்கு மேலோ வரலாம். உ-ம். (லக)+ எனபது லகலகலகலகலகலக என்று எவ்வளவு 'லக-லக'க்களை வேண்டுமானாலும் குறிக்க வல்லது.

? - இதற்கு முன் வரும் குறியீடு ஒரு முறை வரலாம் அல்லது வராமலே போகலாம்.
உ-ம். இ?ராமன். ராமனுக்கு முன் 'இ' போட்டாலும் போடாவிட்டாலும் பொருத்தமே.

[ ] - இவற்றுக்குள் இருக்கும் குறியீடுகளில் ஒன்றைக் குறிக்கும்
உ-ம். க[லரடணன]ம் எனபது கலம், கரம், கணம், கனம், கடம் ஆகியவற்றைக் குறிக்கும். கரணம் என்பதைக் குறிக்காது.

இந்த சதுர அடைப்புக்குறிகளுக்குள் ஒரு rangeஐயும் குறிப்பிடலாம்.

உ-ம் ^[அ-ஔ] என்பது உயிரெழுத்துக்களில் தொடங்கும் சொற்களுக்குப் பொருந்தும். அவ்வாறு வேண்டாமென்பதையும் குறிப்பிட இயலும்
உ-ம் ^[^அ-ஔ] என்பது உயிரெழித்துக்களில் தொடங்கும் சொற்களைத் தவிர இதர சொற்களைத் தருமாறு வேண்டுவதற்காகும். caret(^) சின்னம் சதுர அடைப்புகளுக்குள் வரும்போது அதன் பொருள் வேறுபடுவதைப் பார்க்கலாம்.

( ) - இவற்றுக்குள் இருக்கும் குறியீடுகள் அப்படியே கூட்டாக இயங்கும் எனபதை முந்தைய லகலக உதாரணத்திலேயே பார்த்தோம். அதோடு, இது ஒரு தற்காலிக நினைவகமாகவும் செயல்படுகிறது. அதாவது, இந்த அடைப்புக் குறிகளுக்குள் உள்ளவற்றை $1, $2, $3...... போன்ற பெயர்களைக் கொண்டு இதர வெளிப்பாடுகளில் பயன்படுத்த இயலும்.

| - மேலுள்ள கூட்டெழுத்துகளுக்கு options கொடுக்க இந்தக் குறியீடு பயன்படும்.
உ-ம் .*\.(mp3|wav|wma|ogg|ram|aac)$ என்பது எல்லா விதமான ஒலிக்கோப்புகளையும் தேடிப் பெறுவதற்கு உபயோகப்படும்.

\ - மேலுள்ள குறியீடுகளையே regex கொண்டு தேடணும்ன்னா, அவற்றை அப்படியே கொடுக்க முடியாது. ஆகவே, இந்தக் குறியீட்டைப் பயன்படுத்தி, அவைகளைத் தேடணும். உ-ம். \$[0-9]+(\.00)? $1000.00 என்பதைத் தேடிப் பெறணும். ஆனா $க்கும் .க்கும் regexல வேற பொருள் இருக்கு. ஆகவே \$, \. அப்படீன்னு குறிப்பிட்டு, அதுக்கு regexக்கான பொருளை எடுத்துக் கொள்ளாமல், வழக்கமான பொருளை எடுத்துக் கொள்ளும்படி குறிப்பிடுவதற்குத்தான் இந்தக் குறியீடு. இந்த உத்தியை escape செய்வது என்பார்கள். தவறாகப் புரிந்து கொள்ளப்படுவதிலிருந்து பிழைத்துக் கொள்வது என்று எடுத்துக் கொள்ளலாம்.

அ, ஆ, இ, ஈ தெரிஞ்சாச்சி இல்லையா? இனி படைப்பிலக்கியத்தில் இறங்கி விட வேண்டியதுதான். வாங்க, கொஞ்சம் regex வெளிப்பாடுகளை நாமும் வெளிப்படுத்தலாம்.


(\+[0-9]+[- ])?\(?[0-9]+\)?[- ][0-9]+([- ][0-9]+)? - இந்த அழகான expressionஐக் கொண்டு ஒரு ஆவணத்தில் இடம்பெறும் எல்லா தொலைப்பேசி எண்களையும் பெறலாம்.

^.*sort.*\(.*\).*{$ - இது கோடாளிகளுக்கு. வரிசைப்படுத்தும் (sorting) நிரல்களை தேடிப் பிடிக்கலாம் (hopefully).

^.*(எட்|8)டு?.*.*$ - எல்லா எட்டு போட்ட பதிவுகளின் தலைப்புகளும் ('டு'வுக்கு அடுத்துள்ள கேள்விக்குறியை கவனிக்க! எட்டப்பன், எட்டாக்கனி, எட்டிய உயரங்கள்ன்னு எல்லா சாத்தியங்களையும் cover பண்ணணுமில்லையா?)

^.*(போதும்)+.*(ஐயோ)*.*(அம்மா)*!? - இப்பதிவைப் படித்துக் கொண்டிருக்கும் உங்களின் இப்போதைய மனநிலை இப்படி இருக்காது என்று நம்புகிறேன்.

Regexஐ எங்கே பயன்படுத்துகிறார்கள் என்றால், பொதுவாக மென்பொருள்களில் அதிகமாக இது உபயோகப் படுத்தப் படுகிறது. Markup மொழிகளில் உள்ள ஆவணங்களிலிருந்து வேண்டிய தகவலைப் பிரித்தெடுப்பதற்கு (இதை ஆங்கிலத்தில் parsing என்பார்கள்) இது பயன்படுகிறது. மென்பொருள்களுக்கு அப்பாலும், வழக்கமான தேடலை விட மிகத் துல்லியமான விடைகளை அளிக்கும் சாத்தியத்தை regex நமக்கு அளிக்கிறது. ஆகவேதான், OpenOfficeஇல் இதைக் கொண்டு தேடும் வசதியும் வழங்கப்பட்டுள்ளது. Microsoft Officeஇன் தற்போதைய பதிப்பில் எப்படியென்று தெரியவில்லை. கூகிள் போன்ற இணையத் தேடல்களிலும் இத்தகைய தேடல் வசதியை வழங்கலாமென்று தோன்றுகிறது.

இன்னொரு பயன்பாடு, வலைத்தளங்களின் URLஐ அழகுபடுத்துவதற்கு. வெளியுலகுக்கு ஒரு வலைப்பக்கத்தின் URL www.domain.com/abcd/efgh/ijkl என்று அழகாக வழங்கப்பட்டிருக்கும். ஆனால் பக்கம் இருப்பதுவோ www.domain.com/cgi-bin/abcd.cgi?x=efgh&y=JwwpxU4852&z=ijkl என்று எதாவதொரு கந்திர கோளமான முகவரியில். கொடுக்கப்பட்ட URLஐயும் பக்கம் உண்மையில் இருக்கும் URLஐயும் எப்படி பொருந்த வைப்பது? இதற்குத்தான் web serverஇல் ^/([^/]+)/([^/]+)/([^/]+)$ என்பதைப் போன்ற ஒரு regex எழுதப்பட்டிருக்கும், அதற்குப் பொருந்தும் http வேண்டுகோள்களை இவ்வாறு மாற்றி எழுதுவதற்கு: ^/cgi-bin/$1\.cgi\?x=$2&y=JwwpxU4852&z=$3$. இந்த மாற்றியெழுதுதலுக்கு URL rewriting என்று பெயர். இதற்கு regex பெரிதும் பயன்படுகிறது.

வேறெதுவும் பயன் இருக்கிறதா என்றுத் தெரியவில்லை. இருந்தாலும் ஒரு சாமர்த்தியமான ஒரு நுட்பம் இது என்பதில் சந்தேகமில்லை. மிகவும் பயனுள்ள செயல்பாடுகளை இதனால் நாம் அடையக்கூடும் என்பதை மட்டும் உறுதியாகக் கூறிக் கொள்கிறேன்.

8 கருத்துகள்:

இரா. செல்வராசு (R.Selvaraj) சொன்னது…

VoW, wow! arumai!

A while ago I was trying to make some sense out of regex. Didn't spend much time though. This would be useful and a nice/simple overview. Good work!

Voice on Wings சொன்னது…

செல்வராஜ், நன்றி :) நானும் ஏறக்குறைய அதே நிலையிலதான் இருக்கேன். Regex - கொஞ்சம் புரிஞ்ச மாதிரியும் இருக்கு, கொஞ்சம் புரியாத மாதிரியும் இருக்கு. ஒரு சக்தி வாய்ந்த கருவியா இருக்கக்கூடும் என்ற வகையில் என்னை impress பண்ணியிருக்கு இந்த regex.

பட்டுக்கோட்டை பாரி.அரசு சொன்னது…

regular expressions மிகவும் பயனுள்ள பகுதி. நாங்கள் பயனாளர் உள்ளீடு செய்யும் தகவல்களை சரி பார்க்க (data validation) பயன்படுத்துகிறோம்

அ. இரவிசங்கர் | A. Ravishankar சொன்னது…

இது மாதிரி இன்னும் நிறைய நுட்ப அறிமுகக் கட்டுரைகளை எழுதுங்க..புரிஞ்சுக்க இலகுவா இருக்கு

Voice on Wings சொன்னது…

பாரி.அரசு, உங்கள் தகவலுக்கு நன்றி. ஆமாம், பயனர் படிவங்களில் உள்ளிடப்படும் விவரங்கள் சரியான formatஇல் உள்ளனவா என்பதை regex கொண்டு சரிபார்க்கலாம்தான். client-side javascript கொண்டே இதனை அமைத்திருப்பீர்கள் என்று நம்புகிறேன்.

ரவிசங்கர், புரியும்படி எழுதியிருக்கேன்னா அதில் மகிழ்ச்சிதான். ஆனா இந்த மாதிரி நிறைய எழுதறதுக்கு எனக்கு நிறைய விஷயங்கள் அறிமுகமாகி இருக்கணுமில்லையா? :)

Yagna சொன்னது…

அடடா பிரமாதம். என் மேசையிலும் regex புத்தகமொன்று தூங்குகிறது. என்ன இருந்தாலும் தமிழ்ல கேக்க நல்லாதான் இருக்கு.

Voice on Wings சொன்னது…

வருக, யக்ஞா. உங்கள் தீவிரப் பணிகளெல்லாம் முடிந்து தமிழ்ப்பணிகள் பக்கமா மீண்டும் வந்திருக்கீங்கன்னு நம்பறேன். :)

இந்த இடுகையே நான் regexஐ நன்கு புரிந்து கொள்வதற்கான முயற்சிதான். ஒரு வகையான உரக்கப் படித்தல்ன்னு வச்சிக்கலாம். Regex பற்றி புத்தகம் வாங்கிப் படிக்கமளவுக்கு எனக்கு இன்னமும் தேவை ஏற்படல. இணையத்திலேயே பல தளங்கள் இதை நன்றாக அறிமுகம் செய்கின்றன. குறிப்பா சொல்லணும்னா:

- mod_rewrite tutorial - Apache கோணத்திலிருந்து regex அறிமுகம்.

- ஒரு regex அறிமுகத் தளம்

Yagna சொன்னது…

:) இன்னும் முழுசா முடியலை, ஆனா முடியும் தருவாயில் உள்ளது. நான் கொஞ்சம் நுட்பரீதியாக சில தேவைகளுக்காக regex பத்தி நோட்டம் விட்டேன் அவ்வளவுதான். அபாச்சே சமாச்சாரம் கொஞ்சம் கேள்விப்பட்டதுதான்.