Author: h.mohri
第35回 デベロッパーキャンプは3月15日 UDX GALLERY NEXTで開催決定
開発者のための技術イベント「エンバカデロ・デベロッパーキャンプ」。35回目となる次回の日程が決まりました。2018年3月15日(木)、東京・秋葉原のUDX GALLERY NEXTで開催。今回より、Delphi / C++に加え、Senchaに関する技術情報もお届けする予定です。
Delphi / C++Builderには、TRegEx, TPerlRegExの正規表現があります。
これは、PCRE ライブラリをラップし Delphiで使えるようにしたものです。
TPerlRegEx は、Perl-Compatible 正規表現を実装します。
C++Builderを利用すると、RTLとC++標準ライブラリ両方が利用できます、regexも利用可能です。
両方の良い部分が利用できますので、実装の幅が広がります。
C++Builder 10.2.2 Tokyo で std::regex正規表現クラスを利用
C++Builder 10.2.2 Tokyo ではC++11の機能が使えます。
ターゲットデバイスをiOS(iPhone X)にし、std::regexを C++Builder 10.2で利用して
数字、平仮名、ASCII、メアド以上4項目のパターンマッチを試してみました。
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
<span class="synPreProc" style="color:#9355e6;">#include </span><span class="synConstant" style="color:#ff6666;"><string></span> <span class="synPreProc" style="color:#9355e6;">#include </span><span class="synConstant" style="color:#ff6666;"><regex></span> <span class="synPreProc" style="color:#9355e6;">#include </span><span class="synConstant" style="color:#ff6666;"><functional></span> <span class="synPreProc" style="color:#9355e6;">#include </span><span class="synConstant" style="color:#ff6666;"><vector></span> <span class="synPreProc" style="color:#9355e6;">#include </span><span class="synConstant" style="color:#ff6666;"><tuple></span> <span class="synComment" style="color:#4f80e5;">//---------------------------------------------------------------------------</span> <span class="synType" style="color:#3ec63e;">void</span> __fastcall TForm1::SpeedButton1Click(TObject *Sender) { std::vector<std::tuple<std::wstring, std::wstring> > v1{ <span class="synComment" style="color:#4f80e5;">//When you want to match numbers.</span> {<span class="synConstant" style="color:#ff6666;">L"</span><span class="synSpecial" style="color:#c000c0;">\\</span><span class="synConstant" style="color:#ff6666;">d+"</span>, <span class="synConstant" style="color:#ff6666;">L"regex_match(</span><span class="synSpecial" style="color:#c000c0;">\"\\</span><span class="synConstant" style="color:#ff6666;">d+</span><span class="synSpecial" style="color:#c000c0;">\"</span><span class="synConstant" style="color:#ff6666;">,</span><span class="synSpecial" style="color:#c000c0;">%s</span><span class="synConstant" style="color:#ff6666;">)"</span>}, <span class="synComment" style="color:#4f80e5;">//When you want to match ひらがな.</span> {<span class="synConstant" style="color:#ff6666;">L"^[</span><span class="synSpecial" style="color: #c000c0;">\u3040</span><span class="synConstant" style="color: #ff6666;">-</span><span class="synSpecial" style="color: #c000c0;">\u309F</span><span class="synConstant" style="color: #ff6666;">]+$"</span>, <span class="synConstant" style="color:#ff6666;">L"regex_match(</span><span class="synSpecial" style="color:#c000c0;">\"</span><span class="synConstant" style="color:#ff6666;">^[</span><span class="synSpecial" style="color: #c000c0;">\u3040</span><span class="synConstant" style="color: #ff6666;">-</span><span class="synSpecial" style="color: #c000c0;">\u309F</span><span class="synConstant" style="color: #ff6666;">]+$</span><span class="synSpecial" style="color:#c000c0;">\"</span><span class="synConstant" style="color:#ff6666;">,</span><span class="synSpecial" style="color:#c000c0;">%s</span><span class="synConstant" style="color:#ff6666;">)"</span>}, <span class="synComment" style="color:#4f80e5;">//When you want to match ASCII Code.</span> {<span class="synConstant" style="color:#ff6666;">L"^[</span><span class="synSpecial" style="color: #c000c0;">\x20</span><span class="synConstant" style="color: #ff6666;">-</span><span class="synSpecial" style="color: #c000c0;">\x7E</span><span class="synConstant" style="color: #ff6666;">]+$"</span>, <span class="synConstant" style="color:#ff6666;">L"regex_match(</span><span class="synSpecial" style="color:#c000c0;">\"</span><span class="synConstant" style="color:#ff6666;">^[</span><span class="synSpecial" style="color: #c000c0;">\x20</span><span class="synConstant" style="color: #ff6666;">-</span><span class="synSpecial" style="color: #c000c0;">\x7E</span><span class="synConstant" style="color: #ff6666;">]+$</span><span class="synSpecial" style="color:#c000c0;">\"</span><span class="synConstant" style="color:#ff6666;">,</span><span class="synSpecial" style="color:#c000c0;">%s</span><span class="synConstant" style="color:#ff6666;">)"</span>}, <span class="synComment" style="color:#4f80e5;">//Determine whether the wstring is in E-mail format.</span> {<span class="synConstant" style="color:#ff6666;">L"^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:</span><span class="synSpecial" style="color:#c000c0;">\.</span><span class="synConstant" style="color:#ff6666;">[a-zA-Z0-9-]+)*$"</span>, <span class="synConstant" style="color:#ff6666;">L"regex_match(E-Mail,</span><span class="synSpecial" style="color:#c000c0;">%s</span><span class="synConstant" style="color:#ff6666;">)"</span>} }; std::function<std::wstring(UnicodeString)> str_towstr{[](UnicodeString linp) { std::wstring out; <span class="synStatement" style="color:#d88a17;">for</span> (<span class="synType" style="color:#3ec63e;">int</span> i=<span class="synConstant" style="color:#ff6666;">0</span>; i < linp.Length(); i++) { <span class="synPreProc" style="color:#9355e6;"> #ifndef _WIN64</span> out +=linp[i]; <span class="synPreProc" style="color:#9355e6;"> #else</span> <span class="synComment" style="color:#4f80e5;">/* _WIN64 */</span> out +=linp[i+<span class="synConstant" style="color: #ff6666;">1</span>]; <span class="synPreProc" style="color:#9355e6;"> #endif</span> } <span class="synStatement" style="color:#d88a17;">return</span> out; } }; <span class="synComment" style="color:#4f80e5;">//It was selected in the ComboBox1, the content you want to match.</span> std::wregex wregex1(std::get<<span class="synConstant" style="color:#ff6666;">0</span>>(v1[ComboBox1->ItemIndex]).c_str()); <span class="synComment" style="color:#4f80e5;">//The string you want to match, and assigned to the wstring.</span> std::wstring in_str = str_towstr(Edit1->Text); UnicodeString l_value = Format(std::get<<span class="synConstant" style="color:#ff6666;">1</span>>(v1[ComboBox1->ItemIndex]).c_str(), ARRAYOFCONST((Edit1->Text)) ); <span class="synComment" style="color:#4f80e5;">//It is judged here. Use regex_match.</span> <span class="synStatement" style="color:#d88a17;">if</span> (std::regex_match(in_str, wregex1)) { <span class="synComment" style="color:#4f80e5;">//If the regex_match was successful.</span> Memo1->Lines->Append(<span class="synConstant" style="color:#ff6666;">"Successful "</span> + l_value); Edit1->Text = <span class="synConstant" style="color:#ff6666;">L""</span>; } <span class="synStatement" style="color:#d88a17;">else</span> { <span class="synComment" style="color:#4f80e5;">//If the regex_match failed.</span> Memo1->Lines->Append(<span class="synConstant" style="color:#ff6666;">"NO "</span> + l_value); } } |
ComboBox1中のパターンを選択し、Edit1に文字列を入れてSpeedButton1をタップします。
パターンマッチしている場合はSuccessfulがMemo1に表示されます。
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition