使用regular expression來match中括號(square bracket)
沒想到在C#中也算玩過一陣子的正規表示式(Regular Expression),來到了Linux C/C++中竟然時常碰壁。
現在只是想要找一個用中括號([])包起來的字串,竟然沒有想的那麼簡單。
假設我要找的目標為 [1234],在以前C#的時候的寫法會是\[(?<num>(\d*)\]。來到了Linux C/C++時,也是用原本的概念組了一串這樣的比對格式:
\[([0-9]*\]
沒想到一使用std::regex_match()後就掛了。在編譯(或說指定)這個比對格式給std::regex時就出現Exception了。
這個問題查了一些google上的文章,大家都說遇到正規表示中有的字元的話就是前面加上跳脫字元\就可以啦。沒想到結果會是失敗。
後來看到有人指示要比對中括號的話,需要將它放在中括號中!!
就是用這樣的方式:
[\[]([0-9]*)[\]]
指定要比對於中括號中給定的字元,也就是中括號的左右兩邊的符號。
最後終於是正常編譯過關,且可以正常比對成功了。
而且要注意的是,當將上面這段比對格式放到C/C++的程式碼中,針對\不用再重覆一次,也就是不要寫成
"[\\[]([0-9]*)[\\]]"
這樣比對的結果也是失敗的喔。
現在只是想要找一個用中括號([])包起來的字串,竟然沒有想的那麼簡單。
假設我要找的目標為 [1234],在以前C#的時候的寫法會是\[(?<num>(\d*)\]。來到了Linux C/C++時,也是用原本的概念組了一串這樣的比對格式:
\[([0-9]*\]
沒想到一使用std::regex_match()後就掛了。在編譯(或說指定)這個比對格式給std::regex時就出現Exception了。
這個問題查了一些google上的文章,大家都說遇到正規表示中有的字元的話就是前面加上跳脫字元\就可以啦。沒想到結果會是失敗。
後來看到有人指示要比對中括號的話,需要將它放在中括號中!!
就是用這樣的方式:
[\[]([0-9]*)[\]]
指定要比對於中括號中給定的字元,也就是中括號的左右兩邊的符號。
最後終於是正常編譯過關,且可以正常比對成功了。
而且要注意的是,當將上面這段比對格式放到C/C++的程式碼中,針對\不用再重覆一次,也就是不要寫成
"[\\[]([0-9]*)[\\]]"
這樣比對的結果也是失敗的喔。
留言
張貼留言