Showing posts with label Regular Expression. Show all posts
Showing posts with label Regular Expression. Show all posts

Sunday, July 22, 2007

Regular Expression (စကာလံုးအစုပံုစံ)

စကားလံုးအစုပံုစံ မိတ္ဆက္
(Introduction of Regular Expression)

:. ၁.၁
စကားလံုးအစုပံုစံ (Regular Expression) တစ္ခုဆိုတာ (ကြန္ၿပဴတာေလာက အသံုးအႏွဳန္းအားၿဖင့္္) string အမ်ိဳးအစားမ်ိဳး ၿဖစ္ပါတယ္။ သတ္မွတ္ထားတဲ့ ပံုစံ စည္းမ်ဥ္းစည္းကမ္းမ်ားအတိုင္း စကာလံုး (character) ေတြကို ရွာေဖြဖို ့၊ စကားလံုးအစု (a set of characters)တစ္ခုနဲ ့ အၿခား စကားလံုးအစု တို ့ကို တိုင္ဆိုင္ စစ္ေဆးခ်င္တဲ့ အခါမ်ိဳး၊ အဲဒီလို အခါေေတြမွာ သံုးေလ့ရိွပါတယ္။

တကိုယ္ေရသံုးကြန္ၿပဳတာေတြကို သံုးဖူးတဲ့သူေတြ ဆိုရင္ပဲ ဒီ စကာလံုးအစုပံုစံ (Regular Expression) ကို သံုးဖူးၾကမွာပါ။ စကားလံုးအစုပံုစံကိုသံုးေနတယ္လို ့ သိခ်င္မွေတာ့ သိပါမယ္။ ဥပမာ- ဖိုင္ေတြကို ရွာေဖြခ်င္တဲ့အခါမ်ိဳးေတြမွာေပါ့။ ဖိုင္နာမည္ data နဲ ့ စတဲ့ ဖိုင္အားလံုးကို ရွာခ်င္တယ္ဆိုပါေတာ့။

စက္ထဲမွာ က -
၁. data.doc ၊
၂. data1.doc ၊
၃. data2.doc ၊
၄. dataTXT.txt ၊
၅. dataEXE.exe ၊
၆. dataB.bat

ဆိုၿပီးရိွမယ္လို ့ယူဆၾကမယ္။ ဒါဆို ရွာေဖြတဲအခါ data*.doc ဆိုးၿပီးရိုက္ ထည့္လိုက္။ ၿပီးလို ့ search ဆိုတဲ့ button ေလးကို ႏိွပ္လုိက္ရင္ ခုနက အေပၚဆံုးဖိုင္ ၃ ဖိုင္ကို ကြန္ၿပဳတာ စီမံခန္ ့ခြဲေရးစႏွစ္ (Operating System - OS) က ရွာေပးပါလိမ္မယ္။ တကယ္လို ့ data?.* လို ့ရိုက္ထည့္ခဲ့မယ္ဆိုရင္ေတာ့ ၂ ၊ ၃ နဲ ့ ၆ တိုကို ရွာေပးပါ လိမ့္မယ္။ data*.* ဆိုရင္ေတာ့ ၆ ဖိုင္လံုးေပါ့။

wildcard characters ေတြလို ့ေခၚခဲ့ ၾကတယ္။ ရိုးရိုးရွင္းရွင္းေတြေပါ့။ အခုေၿပာမယ့္ စကားလံုးအစုပံုစံ မွာက ဒီထက္အမ်ားၾကီး က်ယ္ၿပန္ ့ပါတယ္။ အနည္းငယ္လည္း ခတ္မယ္။ wildcard characters ေတြက အေတာ္အသံုးက်ေပ့မယ္လို ့ အကန္ ့့အသတ္ ရိွတယ္။ သူတို ့ေတြဟာ စကားလံုးပံုအစုပံုစံ (Regular Expression) ရဲ ့ သေဘာတရား ကို မိတ္ဆက္ေပးခဲ့ပါတယ္။

:. ၁.၂
စကားလံုးအစုပံုစံရဲ ့ မူလဇစ္ၿမစ္ဟာ သီ၀ရီသေဘာတရားဆိုင္ရာကြန္ၿပဳတာသိပံၸ (theoretical computer science) ရဲ ့ အစိတ္အပိုင္းေတြၿဖစ္ၾကတဲ့ automata theory နဲ ့ formal language theory တို ့ပဲၿဖစ္ၾကပါတယ္။ စကားလံုးအစုပံုစံ ကို formal language theory နဲ ့ ေဖာ္ၿပေရးသားရပါတယ္။ (ေလ့လာလိုသူမ်ား ဆက္ၿပီးေလ့လာၾကပါ။ ဒီေၾကာင္း ေတြက ဒီပိုစ္နဲ ့မဆိုင္ပါ။)

:. ၁.၃
စကားလံုးအစုပံုစံ (Regular Expression) ကိုသံုးၿခင္းအားၿဖင့္

- အခ်က္အလက္ မွန္ကန္ေၾကာင္း စစ္ေဆးၿခင္းမ်ား (Data Validation & Verification)

ဥပမာ - ၀င္ေရာက္လာတဲ့ တယ္လီဖုန္းနံပါတ္ က ကိုယ္လိုခ်င္တဲ့ စံပံုစံ (pattern) ဟုတ္မဟုတ္စစ္ေဆးၿခင္း ၊ လိုခ်င္တဲ့ ပံုစံက ၉၀a-၃၄-၅d-၃ ဆိုပါေတာ့၊ အဲဒီပံုစံမဟုတ္ပဲ ၉၀3၅၅-၅%၇၅၄ ဆိုရင္္ စံပံုစံ (pattern) အားၿဖင့္ မွားတယ္။

- စာမ်ား အစားထိုးၿခင္း (Replace Text)

ဥပမာ - I love you very much. No matter what you are, I love you. ေပါ့။ဒီလို စာေတြ စာရြက္ေပါင္း မ်ားစြာရိွမယ္ဗ်ာ။ ဒါကို (ႏွစ္အနည္းငယ္ၾကာလာတဲ့အခါ) love အစား hate နဲ ့အစားထုိးခ်င္တယ္ ဆိုပါေတာ့။အဲဒီလို အခ်ိန္မွာ သိပ္အသံုးက်တယ္။

- စာအစဥ္အတန္း (String) တစ္ခုထဲကေန ကိုယ္လို ခ်င္တဲ့ အစိတ္အပိုင္း ေလးတစ္ခုကိုပဲ ထုတ္ယူၿခင္း (Extract text)

ဥပမာ - အေပၚက စာထဲကပဲ love ဆိုု တဲ့ စာလံုးကိုပဲ ထုတ္ယူခ်င္တဲ့အခါမ်ိဳး။
စသည္တုိ ့ေတြမွာ အလြန္ အသံုး၀င္ပါတယ္။

စာအစဥ္အတန္း (String) ေတြကို ကိုင္တြယ္တဲ့ေန ရာမွာ နာမည္မၾကီးတဲ့ javascript လို ပရိုဂရမ္ ဘာသာရပ္ေတြမွာ စကားလံုးအစုပံုစံ (Regular Expression) က အသံုးက် ၾကပါတယ္။

ဆတ္ရန္။

ရည္ညြန္း။ ။ MSDN, Wikipedia - the free encyclopedia

အာေကလာ (Akela)

july 21, 2007 2:42 am

မွတ္ခ်က္။ ။ ပိုစ္ေတြကို ကၽြန္ေတာ္ စာလံုးမ်ားကို တက္ႏိုင္သေလာက္ ၿမန္မာမွဳၿပဳထာပါတယ္။ ပညာရွင္မဟုတ္တဲ့ အတြက္ စာလံုးေတြက ေထာက္ေနပါတယ္။ ကၽြန္ေတာ္ကိုယ္တိုင္ ေရးေနရင္းနဲ ့ ခဏခဏရယ္ၿဖစ္ပါတယ္။ ဒါေပ့မယ္ေပါ့ေလ တက္ႏိုင္သမွ်ေတာ့ ၾကိဳးစားၿပီးၿမန္မာ လို ပဲေရးပါမယ္။ အခုအစၿပဳမိရင္ ေနာင္က်ေတာ့ဒီထက္ေကာင္းတဲ့ အဓိပၸါယ္ၿပည့္စံုတဲ့ ၿမန္မာစာလံုးေတြ ထြက္လာႏိုင္တယ္လို ့ေမွ်ာ္လင့္ပါတယ္။



Saturday, July 21, 2007

စကားလံုးအစုပံုစံ ၀ါက်
(Regular Expression Syntax)

:. ၂.၁
စကားလံုးအစုပံုစံ (Regular Expression) ဆိုတာ စာကားလံုးမ်ားကိုသံုးထားတဲ့ ပံုစံ (pattern of Text) ၿဖစ္တဲ့အတြက္ သူ ့မွာ သာမန္ စကားလံုးမ်ား (ordinary characters - a မွ z အထိ) ၊ အထူး စကားလံုးမ်ား (special characters or metacharacters) ေတြပါ၀င္ပါတယ္။

ေအာက္ပါ ဇယားကြက္မွာ အထူး စကားလံုးမ်ား (metacharacters**) နဲ ့ သူတို ရဲ ့ ၿပဳမွဳ ႏိုင္တဲ့စြမ္းရည္ (behavior) တိုကို ေဖာ္ၿပထားပါတယ္။

စကားလံုးမ်ား (Characters)

အဓိပါယ္ဖြင့္ဆိုခ်က္(Description)



\

သူေနာက္က စာလံုးကို special characters ၊ သို ့ literal အၿဖစ္ ၿပဳမွဳေပးပါတယ္။ ဥပမာ -ပံုမွန္ဆိုရင္ ‘n’ က စာလံုး “n” နဲ ့ တိုက္စစ္ (Match) ပါတယ္။ ဒါေပမယ္ ‘\n’ ၿဖစ္သြားရင္ေတာ့ ေနာက္ အသစ္တလိုင္း (newline character) ၿဖစ္သြားပါတယ္။ ‘\\’ က “\” နဲ ့တိုက္ၿပီး ၊ “\(” က “(” နဲ ့တိုက္စစ္ပါတယ္။

^

၀င္လာတဲ့ စာအစဥ္အတန္း (Input string )ရဲ ့ ပထမဆံုး ေနရာ (position at the beginning) ကို တိုက္စစ္္ပါတယ္။

$

၀င္လာတဲ့ စာအစဥ္အတန္း (Input string )ရဲ ့ ေနာက္ဆံုး ေနရာ (position at the end) ကို တိုက္စစ္္ပါတယ္။

*

သူရဲ ့ေရွမွာ ရိွေနတဲ့ စာလံုး(character) သို ့မဟုတ္ စာလံုးအစုငယ္ (subexpression) ေတြကို 0 or more အၾကိမ္အေရအတြက္ တိုက္ပါတယ္။ ဥပမာ - “zo*” က “z” and “zoo” ကို တိုက္ပါတယ္။ * က {0,} နဲ ့ အတူတူပဲ ၿဖစ္ပါတယ္။ သေဘာက o က လံုး၀မပါရင္လည္းၿဖစ္တယ္။ တစ္လံုးထက္ပိုပါရင္လည္း ၿဖစ္တယ္။

+

သူရဲ ့ေရွမွာ ရိွေနတဲ့ စာလံုး(character) သို ့ စာလံုးအစုငယ္ (subexpression) ေတြကို one or more အၾကိမ္အေရအတြက္ တိုက္ပါတယ္။ ဥပမာ - “zo+” က “zo” and “zoo” ကို တိုက္ပါတယ္။ ဒါေပမယ့္ “z” ကို မတိုက္ပါဘူး။ + က {1,} နဲ ့ အတူတူပဲၿဖစ္ပါတယ္။ သေဘာက o က အနည္းဆံုး ၁လံုးပါရတယ္။ တစ္လံုးထက္ပိုပါရင္လည္း ၿဖစ္တယ္။

?

သူရဲ ့ေရွမွာ ရိွေနတဲ့ စာလံုး(character) သို ့ စာလံုးအစုငယ္ (sub expression) ေတြကို 0 or 1 အၾကိမ္အေရအတြက္ တိုက္ပါတယ္။ ဥပမာ - “do(es)?” က “do” and “does” ကို တိုက္ပါတယ္။ ? က {0,1} နဲ ့အတူတူပဲၿဖစ္ပါတယ္။ သေဘာက o က လံုး၀မပါရင္လည္းၿဖစ္တယ္။ တစ္လံုးတည္းပါရင္လည္း ၿဖစ္တယ္။

{n}

ဒီမွာ n က အႏုတ္ကိန္းမဟုတ္ရပါ။ n ၾကိမ္အေရအတြက္ အတိ အက် တိုက္ပါတယ္။ ဥပမာ - ‘o{2,}’ လို ့ဆိုရင္ “Bob” ထဲမွာ ရိွ တဲ့ o နဲ ့မတိုက္ပါဘူး။ ဒါေပမယ့္ “food” ထဲမွာရိွတဲ့ o ႏွစ္လံုးနဲ ့ ေတာ့ တိုက္ပါတယ္။

{n,}

ဒီမွာ n က အႏုတ္ကိန္းမဟုတ္ရပါ။ အနိမ့္ဆံုး n ၾကိမ္ အေရ အတြက္္နဲ ့ တိုက္ပါတယ္။ ဥပမာ - ‘o{2}’ လို ့ဆိုရင္ “Bob” ထဲမွာ ရိွ တဲ့ o နဲ ့မတိုက္ပါဘူး။ ဒါေပမယ့္ “fooooood” မွာရိွတဲ့ o အားလံုးနဲ ့ ေတာ့တိုက္ပါတယ္။ ‘o{1,}’ က အထက္မွာ ေဖၚၿပခဲ့တဲ့ ‘o+’ နဲ ့အတူတူပဲၿဖစ္ပါတယ္။

{n,m}

ဒီမွာ n နဲ ့ m က အႏုတ္ကိန္းမဟုတ္ရပါ။ n က m ထက္ ငယ္ရင္ငယ္ ၊ မငယ္ရင္ ညီရပါမယ္ (n <= m)။ အနိမ့္ဆံုး n ၾကိမ္ ၊ အၿမင့္ဆံုး m ၾကိမ္ အေရအတြက္ နဲ ့့ တိုက္ပါတယ္။ ဥပမာ - ‘o{1,3}' ဟာ “fooooood” မွာရိွတဲ့ ပထမ o သံုးလံုးနဲ ့ တိုက္ပါတယ္။ ‘o{0,1}’ က အထက္မွာ ေဖၚၿပခဲ့တဲ့ ‘o?’ နဲ ့ အတူတူပဲၿဖစ္ပါတယ္။ “o{1,}” က အထက္မွာေဖၚၿပခဲ့တဲ့ ‘o+’ နဲ ့ တူၿပီး ၊ “o{၀,}” ကေတာ့့ ‘o*’ နဲ ့ အတူတူပဲၿဖစ္ပါတယ္။

?

ဒီ ? က (*,+,?,{n},{n,},{n,m}) တို ရဲ ့ ေနာက္မွာ ခ်က္ခ်င္း ရိွေနတယ္ဆိုရင္ အဲဒီပံုစံကို non-greedy pattern လုိ ့ေခၚပါ တယ္။ non-greedy pattern ဆိုတာ တုိက္စစ္တဲ့အခါ နည္းႏိုင္ သမွ်နည္းေအာင္တုိက္စစ္ပါတယ္။ ပံုမွန္ ပံုစံ(pattern) က မ်ား ႏိုင္သမွ်မ်ားေအာင္တုိက္စစ္ပါတယ္။ ဥပမာ - “oooo” ဆို တဲ့ စာအစဥ္ အတန္း (string) မွာ ၊ ‘o+?’ က ‘o’ တစ္လံုးတည္းနဲ ့ တိုက္စစ္ၿပီး ၊ ? မပါ တဲ့ ‘o+’ က ‘o’ အားလံုးနဲ ့တိုက္စစ္ပါတယ္။

.

“\n” (newline character) ကလြဲရင္ ‘.’ (dot) ကေလးဟာ စကာလံုးအားလံုးနဲ ့ တိုက္စစ္ပါတယ္။ “\n” ကိုပါ တိုက္စစ္ခ်င္ တယ္ဆိုရင္ေတာ့ ‘[\s\S]’ ဆိုတဲ့ ပံုစ(pattern) ံကို သံုးႏိုင္ပါတယ္။

x|y

သူက ‘ x ’ ဒါမွမဟုတ္ ‘ y ’ ကိုတိုက္စစ္ပါတယ္။ ဥပမာ- “z|food” ဟာ “z” ဒါမွမဟုတ္ “food” နဲ ့ တိုက္ပါတယ္။ “(z|f)ood” က်ေတာ့ “zood” ဒါမွမဟုတ္ “food” နဲ ့တိုက္ စစ္ပါတယ္။ “|” ဒီစာလံုးေလးက or (တစ္ခုမဟုတ္တစ္ခု) ဆိုတဲ့ အဓိပါယ္ရိွပါတယ္။

[xyz]

သူကေတာ့ စကားလံုးအစုပါပဲ။ ေဒါင့္ကြင္း([]) ထဲမွာ ရိွတဲ့ ဘယ္စကားလံုးနဲ ့ မဆို တိုက္စစ္ပါတယ္။ ဥပမာ- [abc] က

“plain” ထဲက “ a ” နဲ ့တိုက္စစ္ပါတယ္။

[^xyz]

သူကေတာ့ စကားလံုးအစုပါပဲ။ ေဒါင့္ကြင္း([]) ထဲမွာ ရိွတဲ့ စကားလံုးမ်ား နဲ ့မတူတဲ့ အၿခားစကားလံုးမ်ားကို တိုက္စစ္ ပါတယ္။ ဥပမာ- [^abc] က “plain” ထဲက “ p ” ၊ “ l ” ၊ “ i ” ၊ “ n ” တိုက္စစ္ပါတယ္။ ^ က မဟုတ္ (not) ဆိုတဲ့ အဓိပါယ္ရိွ ပါတယ္။

[a-z]

သူကေတာ့ စကားလံုး အတိုင္းအတာ (range of characters) တစ္ခုပါပဲ။ဥပမာ - [a-m] ဟာ a နဲ ့ m ၾကားမွာရိွတဲ့ မည္သည့္ စကားလံုးကို မဆို တိုက္စစ္ပါ တယ္။

[^a-z]

သူကေတာ့ စကားလံုး အတိုင္းအတာ (range of characters) တစ္ခုပါပဲ။ဥပမာ - [^a-m] ဟာ a နဲ ့ m ၾကားမွာရိွတဲ့ စကားလံုးမ်ားမွ လြဲ ၿပီး မည္သည့္စကားလံုးနဲ ့မဆို တိုက္စစ္ပါ တယ္။^ က မဟုတ္ (not) ဆိုတဲ့ အဓိပါယ္ရိွ ပါတယ္။

ဆက္ရန္။

ရည္ညြန္း။ ။ MSDN, Wikipedia - the free encyclopedia, Google

့့့အာေကလာ(Akela)

july 22, 2007 2:42 am

july 26,2007 00:02 am (midinght) (modified)

မွတ္ခ်က္။ ။ ပိုစ္ေတြမွာ ကၽြန္ေတာ္ စာလံုးမ်ားကို တက္ႏိုင္သေလာက္ ၿမန္မာမွဳၿပဳထာပါတယ္။ ပညာရွင္မဟုတ္တဲ့ အတြက္ စာလံုးေတြက ေထာက္ေနပါတယ္။ ကၽြန္ေတာ္ကိုယ္တိုင္ ေရးေနရင္းနဲ ့ ခဏခဏရယ္ၿဖစ္ပါတယ္။ ဒါေပ့မယ္ေပါ့ေလ တက္ႏိုင္သမွ်ေတာ့ ၾကိဳးစားၿပီးၿမန္မာ လို ပဲေရးပါမယ္။ အခုအစၿပဳမိရင္ ေနာင္က်ေတာ့ဒီထက္ေကာင္းတဲ့ အဓိပၸါယ္ၿပည့္စံုတဲ့ ၿမန္မာစာလံုးေတြ ထြက္လာႏိုင္တယ္လို ့ေမွ်ာ္လင့္ပါတယ္။