[UnrealC++]UE4における正規表現について
今回はUE4で正規表現を使う方法について紹介します。
はじめに
UE4で正規表現を使うには、FRegexMatcherとFRegexPatternを使います。
これらのクラスの実装(ICURegex.cpp)を見てみると、unicode/regex.hをラップして実装していることが確認できます。上記のFRegexMatcherとFRegexPatternのドキュメントを見ても関数の詳細が書かれていませんが、ICURegex.cppの実装とここを見れば関数の詳細を調べることができます。
UE4で使用されている正規表現は、名前から明らかにICU正規表現です。ICU正規表現のドキュメントはここにありました。把握するのが億劫になりますが、よく使う量指定子やキャプチャなどの書き方は、他の正規表現と大きく変わるものではありません。適当に検索した正規表現の書き方入門にあるものを参考に書いても、問題なく動くはずです。
正規表現のパターンを作る
今回は、文章の中に埋め込まれた「イベントの番号」を取得する方法について考えます。
例えば、次のような文章があります。
「この文章は<event 23>正規表現のテスト<event 551>です。」
この文中から、<event 23>と<event 551>をマッチさせて、キャプチャによって23と551を取得する正規表現を考えます。次のようにしました(筆者は正規表現にそれほど詳しくないので、見苦しい書き方があった場合は指摘するか大目に見てください)。
"< *event *([0-9]+) *>"
「<」は埋め込みの開始文字です。
「 *」は、スペースの0回以上の繰り返しにマッチします。「<event~」や「< event~」や「< event~」のように、<とeventの間の任意の空白に対応するようしました。
「event」は埋め込みの識別文字です。
「 *」は前述と同じです。「~event21~」や「~event 345~」や「~event 8~」のようにeventと数字の間の任意の空白に対応するようにしました。
「([0-9]+)」は、1回以上の数字の繰り返しにマッチします。()は、キャプチャのために記述しています。
「 *」も前述と同じです。「~12>」や「~345 >」や「~6 >」のように、数字と>の間の任意の空白に対応するようにしました。
「>」は埋め込みの終了文字です。
UE4で正規表現を使う
今回は、BlueprintFunctionLibraryを使って実装します。次のようにします。
BPFL_RegexTest.cpp 3行目:ヘッダにRegex.hを追加します。このヘッダの追加に必要な新たなモジュールの追加などはありません。
BPFL_RegexTest.cpp 9・10行目:パターンとマッチャーを生成します。
BPFL_RegexTest.cpp 12行目:FindNext()によって、パターンマッチングを行います。パターンにマッチしたら、trueとなります。これがfalseになる(マッチしなくなる)までwhile文で反復します。
BPFL_RegexTest.cpp 14行目:キャプチャから数字を取得します。GetCaptureGroup()のインデックスに1を指定しているのは、前に示したパターン"< *event *([0-9]+) *>"の1つ目のキャプチャ([0-9]+)を指定するためです。ここでインデックスが0から始まらないことに気持ち悪さを感じるかもしれませんが、0番目のキャプチャは多くの場合、マッチした部分全てを格納するために使われます。
BPFL_RegexTest.cpp 15~18行目:キャプチャした文字列を整数に変換して結果の配列に格納します。
作ったBlueprintFunctionLibararyを、レベルブループリント上で図1のようにします。
これを実行すると図2のようになります。
文字列に埋め込まれたイベント番号を取得できました。
この記事は次のバージョンで作成されました。
Unreal Editor(4.15.2-3416026+++UE4+Release-4.15)
Microsoft Visual Studio Community 2017 Version 15.1 (26403.7)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma once | |
#include "Kismet/BlueprintFunctionLibrary.h" | |
#include "BPFL_RegexTest.generated.h" | |
UCLASS() | |
class BLOGTEST_API UBPFL_RegexTest : public UBlueprintFunctionLibrary | |
{ | |
GENERATED_BODY() | |
public: | |
UFUNCTION(BlueprintCallable, Category = RegexTest) | |
static TArray<int32> GetEvNumsFromMes(const FString message); | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "BlogTest.h" | |
#include "BPFL_RegexTest.h" | |
#include "Regex.h" | |
TArray<int32> UBPFL_RegexTest::GetEvNumsFromMes(const FString message) | |
{ | |
TArray<int32> numbers; | |
const FRegexPattern pattern = FRegexPattern(FString(TEXT("< *event *([0-9]+) *>"))); | |
FRegexMatcher matcher(pattern, message); | |
while (matcher.FindNext()) | |
{ | |
FString numStr = matcher.GetCaptureGroup(1); | |
if (numStr.IsNumeric()) | |
{ | |
numbers.Add(FCString::Atoi(*numStr)); | |
} | |
} | |
return numbers; | |
} |
BPFL_RegexTest.cpp 9・10行目:パターンとマッチャーを生成します。
BPFL_RegexTest.cpp 12行目:FindNext()によって、パターンマッチングを行います。パターンにマッチしたら、trueとなります。これがfalseになる(マッチしなくなる)までwhile文で反復します。
BPFL_RegexTest.cpp 14行目:キャプチャから数字を取得します。GetCaptureGroup()のインデックスに1を指定しているのは、前に示したパターン"< *event *([0-9]+) *>"の1つ目のキャプチャ([0-9]+)を指定するためです。ここでインデックスが0から始まらないことに気持ち悪さを感じるかもしれませんが、0番目のキャプチャは多くの場合、マッチした部分全てを格納するために使われます。
BPFL_RegexTest.cpp 15~18行目:キャプチャした文字列を整数に変換して結果の配列に格納します。
作ったBlueprintFunctionLibararyを、レベルブループリント上で図1のようにします。
![]() |
図1 GetEvNumsFromMesを使用する |
これを実行すると図2のようになります。
![]() |
図2 実行結果 |
文字列に埋め込まれたイベント番号を取得できました。
おわりに
今回の例は単純なためStringの機能だけでも十分かもしれませんが、複雑なパターンマッチングが必要な場合は正規表現を避けて通れないでしょう。現状、UE4における正規表現は最低限の機能しか実装されていないように見えますが、初心者的には十分実用的であると感じました。これらの機能がBlueprintとして公開されていないのが不思議ではありますが、自分でBlueprintに公開するのもそれほど難しくなさそうなので、必要に応じてラッパークラスを作っても良いかもしれません。
この記事は次のバージョンで作成されました。
Unreal Editor(4.15.2-3416026+++UE4+Release-4.15)
Microsoft Visual Studio Community 2017 Version 15.1 (26403.7)
T-Fal Titanium Pan - Titanium Arts
返信削除T-Fal Titanium Pan. This Pan is mens titanium braclets the perfect pan for any pan black titanium wedding band pan. It will titanium watch band be the perfect pan. T-Fal Titanium Pan Pan titanium straightener is perfect for any pan. titanium white fennec