Regular Expression

Regular Expression ကို စသိခဲ့တုန်းက email validation မှာ စသိခဲ့တယ်။ Regular Expression ကို သေသေချာချာ နားမလည်ခဲ့ဘူး။ နားလည်အောင် လုပ်ဖို့လည်း သိပ်ပြီး မလွယ်လှဘူး။ Programming စာအုပ်တော်တော်များများ သင်တန်းတော်တော်များများမှာ regular expression ကို သီးသန့် အနေနဲ့ ပါဝင်တာ အတော်ရှားပါတယ်။

MZ forum ကို ပြောင်းဖို့ Zawgyi to Unicode converter စရေးတော့ regular expression က မဖြစ်မနေ လိုအပ်လာတယ်။ အဲဒီအချိန်က စပြီး regular expression ကို သဘောကျမိခဲ့တယ်။ Swift နဲ့ Markdown Editor တစ်ခု အတွက် syntax highlighter ရေးတော့ regular expression သိခဲ့တဲ့ အကျိုးကျေးဇူးတွေခံစားရပါတယ်။

Get Match

Regular Expression ကို Regex လို့ အတိုကောက်သုံးကြတယ်။ programming language အကုန်လုံးမှာ ရှိပါတယ်။ ကျွန်တော်တို့ အနေနဲ့ expression မှန်မမှန် စမ်းဖို့ အတွက် ကျွန်တော်ကတော့ regex101 မှာ စစ်ကြည့်ပါတယ်။

ပထမဆုံး ကျွန်တော်တို့ တွေ အနေနဲ့ basic လေးတွေ ကနေ စကြည့်ရအောင်။ Regular Expression မှာ match နဲ့ replace ဆိုပြီး ၂ မျိုး သုံးကြပါတယ်။ match ကတော့ ကိုယ်ထည့်လိုက်သည့် expression မှန်မမှန် စစ်တာပါ။ ဥပမာ email validation , phone number validation စစ်တာမျိုးပေါ့။ replace ကတော့ ကျွန်တော်တို့ Rabbit converter မှာ သုံးသလို လိုချင်သည့် အပိုင်းကို ရှာပြီး ဖြစ်ချင်တာနဲ့ ပြောင်းသည့် အပိုင်းပေါ့။

<a href="http://www.google.com">Google</a> , <a href="http://www.github.com">Github</a>

ဒီစာမှာ ကျွန်တော်တို့တွေက link တွေပဲ ဆွဲထုတ်မယ် ဆိုပါစို့။ HTML အရ ဒီလို စဉ်းစားလို့ ရပါတယ်။ href ထဲက စာတွေ အကုန်လုံးတွေ ကို ဆွဲထုတ်ဖို့ လိုပါတယ်။

ကျွန်တော်တို့တွေ အနေနဲ့ ဒီလို ရေးပါတယ်။

href="(.*?)"

.* ဆိုသည့် အဓိပ္ပာယ်ကတော့ any character except line break and space ပါ။

.* လို ဆိုလိုက်ရင် href=" ကနေ github.com" အဆုံးထိ ဆိုသည့် အဓိပ္ပာယ် ရသွားပါတယ်။ အကြိမ်အရေ အတွက် နဲ့ လိုချင်သည့် အခါမှာ .*? လို သုံးပါတယ်။ အဲဒီ အခါမှာ http://www.google.com နဲ့ http://www.github.com ရပါတယ်။

ကျွန်တော်တို့ python code နဲ့ ရေးကြည့်ရအောင်။

import re
html = '<a href="http://www.google.com">Google</a> , <a href="http://www.github.com">Github</a>'
m = re.findall(r'href="(.*?)"',html)
print(m)
#['http://www.google.com', 'http://www.github.com']

python မှာ regular expression ဆိုရင် string ရှေ့မှာ r ထည့်ပါတယ်။

Validation

အခု ကျွန်တော်တို့တွေ mobile ဖုန်းနံပတ်ကို စစ်ကြည့်ရအောင်။ အခြေခံအားဖြင့် 09 သို့ဟုတ် 959 နှင့်စမယ် ဂဏန်း ၅ လုံးကနေ ၁၀ လုံး နောက်ကနေ ပါမယ်။ အဲလို အတွက်ဆိုရင်

(09|959)\d{5,10}

ဆိုပြီး ရေးနိုင်ပါတယ်။ | ကတော့ or ဆိုသည့် အဓိပ္ပာယ်ပါ။ \d ကတော့ digit ဖြစ်ရမယ် ဆိုသည့် အဓိပ္ပာယ်ပါ။ {5,10} ဆိုတာကတော့ 5 လုံးကနေ ၁၀ လုံး ဖြစ်ရမယ် ဆိုတာပါ။

import re
number = "09873274111";
m = re.match(r'(09|959)\d{5,10}',number)
if m==None:
    print("NOT CORRECT FORMAT")
else:
    print("CORRECT FORMAT")

မြန်မာစာ unicode စာလုံးပါ မပါ စစ်ကြည့်ရအောင်။

[\u1000-\u109F\uA9E0-\uAA7F]+

လေးထောင့်ကွင်း [] ကတော့ အထဲမှာ ပါမည့် စာတွေ ကို ဆိုလိုတာပါ။ ဥပမာ [a-z] ဆိုရင် a ကနေ z အဓိပေါ့။ [a-zA-Z0-9] ဆိုရင် a ကနေ z အထိ ဒါ့အပြင် A ကနေ Z အထိ နှင့် 0 ကနေ 9 အထိ စသည့် စာလုံးတွေ ပါမယ်လို့ ဆိုတာပါ။ အခု မှာကတော့ မြန်မာ unicode range ဖြစ်သည့် \u1000 ကနေ \u109F ထိ ပြီးရင် extend ထပ်ပြီးလုပ်ထားသည့် unicode range ဖြစ်သည့် \uA9E0 ကနေ \uAA7F ထိ လို့ ဆိုထားပါတယ်။ + ကတော့ one or more ကို ဆိုလိုတာပါ။ * ဆိုရင် zero or more ကို ဆိုလိုတာပါ။

import re
text = "a"
m = re.match(r'[\u1000-\u109F\uA9E0-\uAA7F]+',text)
if m==None:
    print("Not include Myanmar Unicode")
else:
    print("Include Myanmar Unicode")

Search And Replace

Facebook , Twitter တို့မှာ mention ခေါ်တာ မြင်ဖူးမှာပါ။ @name ဆိုပြီး ခေါ်ထားတာပေါ့။ အခု ကျွန်တော်တို့တွေ mention name ကို html link လေး တွဲသည့် ပုံစံ ရေးကြည့်ရအောင်။

Hello! @saturngod. I am @saturn and @god.

ဆိုသည့် စာ ကို

Hello! <a href="/username/saturngod">@saturngod</a>. I am <a href="/username/saturn">@saturn</a> and <a href="/username/god">@god</a>.

ဆိုပြီး ပြောင်းချင်ပါတယ်။ @name ကို /username/name ဆိုပြီး link ထည့်ချင်တာပါ။

regular expression အရ

@(.*?)(\s|\n|\.)

ဆိုပြီး ကျွန်တော်တို့တွေ ရေးပါမယ်။ @ နဲ့ စမယ်။ စိတ်ကြိုက်စာလုံးဖြစ်မယ်။ \s ကတော့ space ပါ။ \n ကတော့ line breaking ပါ။ space line breaking သို့မဟုတ် . က နောက်မှာ ရှိမယ်လို့ ဆိုတာပါ။ . က regular expression မှာ any character ဖြစ်သည့် အတွက် string dot ဖြစ်ကြောင်း သိစေဖို့ အတွက် \ ထည့်ထားတာပါ။

import re
s = "Hello! @saturngod. I am @saturn and @god."
mention = re.sub(r"@(.*?)(\s|\n|\.)", r"<a href='/username/\1'>@\1</a>\2", s)
print(mention)

\1 ကတော့ group 1 ဖြစ်ပြီးတော့ \2 ကတော့ group 2 ဖြစ်ပါတယ်။ ကျွန်တော့် code မှာ ဆိုရင် group 1 က username ဖြစ်ပြီး group 2 ကတော့ ending ဖြစ်ပါတယ်။ group တွေဟာ လက်သည့် ကွင်း () နှင့် ဖန်တီးပါတယ်။

ဒီလောက် ဆိုရင် အကြမ်းတော့ သိလောက်ပါပြီ။ ထပ်ပြီးလေ့ကျင့်ချင်ရင် markdown ကနေ HTML parser တစ်ခု လောက် ရှေးကြည့်ပါ။

Markdown To HTML

# H1
## H2
### H3
**bold**
_italic_
[link](http://www.google.com)

အဲဒီ စာတွေကို

<h1>H1</h1>
<h2>H2</h2>
<h3>H3</h3>
<b>bold</b>
<i>italic</i>
<a href="http://www.google.com">link</a>

ဆိုပြီး ပြောင်းသည့် code လေး ရေးကြည့်ကြည့်ပါ။

2 Comments

  1. John AgNge says:

    Awww. Regular expression = 正式表現
    Thanks ?

  2. Yan Naing says:

    So sad. \u is not supported in excel vba regular expression engine. :'(
    I am writing unicode converter in Excel VBA. A bit difficult

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.