C++ regular expression

ss
2 min readSep 29, 2018

--

無聊刷題時, 突然被一提搞到很煩

isIPv4Address

主要就是給你一段字串, 決定他是不是屬於ipv4的ip

我一開始想了很多種方法, 也寫了一堆hard code

結果發現別人兩行搞定

regex r("((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])");return regex_match(s, r);

原來是用了regular expression

正規表示式, 這邊就不細說了, 這是一個算是蠻多內容的學問, 可以直接搜尋google就會有很多資訊了

我們來分析這段code要表達的東西

首先 我們先看第一個刮到的內容

(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])

由於ipv4是用10進位來表示2進位可能的值 而ipv”4" 的4表示有四個區間

所以一個區間有8位數, 最大範圍就從 1~ 2⁸ -1

所以這邊我們可以看到 25[0–5] 表示這個職可以是 250 ~ 255之間,

再來我們看到 |, 這邊的意思就是說 除了25x 這個也可以是別的值, 200 ~ 249 與 100 ~ 199, 19~99, 0 ~9, 等於是這麼括弧包含了所有ip值得可能值

接著我們可以看到

\\.{3}

這邊的兩個backslash 很有意思,backslash指的是逃脫字元, 主要表示有些字元在shell 中是有特殊意義的, 我們必須拿掉這樣的意義, 在c++ 編譯器中, 一個backslash 有其他的表示意思, 像是我們在字串中加入 “\n”代表換一行的意思,故我們如果想要將backslask 表示成逃脫字元, 必須用 \\ 來代替

在這邊注意到. 的意思代表任何一個字元, 但是我們只是單純想要讓他擔任小數點的腳色, 故我們用逃脫字元 \\ 來使他的特殊意義失去效力,

最後{3}表示限定連續的字符範圍, 我可以將以上這段重複三次, 剛好表示成ipv4的前三個區間, 最後一個區間再依樣畫葫蘆即可

regex_match(s, r);

用regex_match表示此字串是否有滿足regular expression的規定,

有的話回傳true, 無的話則回傳false

--

--

ss
ss

No responses yet