1

re2.h を使用し、部分一致を行っています。

入力文字列が「123.45.34.5:8080」であるとします。「123.45.34.5」と「8080」が返されます。

入力文字列が「123.45.34.5」であると仮定します。「123.45.34.5」と「」も返されます。正規表現の書き方は?次のコードは機能しません。

string portRegex = "[ \r\t]*([0-9a-f]*)[ \r\t]*";
string IPRegex = "([^ \r\t]*)^[^:]*";
string alertRegexStr = IPRegex + portRegex;
m_alertRegex = new RE2(alertRegexStr.c_str());

   bool match = RE2::PartialMatch(input_string,*m_alertRegex,
                            &cip,
                            &source_port);

ありがとう、

アップデート

これで、次のコードが機能します。

string IPRegex = "([^ \r\t:]*)";

string portRegex = "[ \r\t]*:?[ \r\t]*([0-9a-f]*)[ \r\t]*";

しかし、質問があります。なぜ " string IPRegex = "([^ \r\t:]*?)"; " が機能しないのですか? *はどう違いますか?* ?

4

2 に答える 2

2

の周りの両方の部分をキャプチャするには:、次を使用できます

^([^:]*)(?::([^:]+))?$

demoを参照してください。結果はキャプチャ グループ 1 と 2\nにあります (正規表現デモの は、複数行モードがオンになっているため、デモ目的で使用されます)。

ご質問について

なぜstring IPRegex = "([^ \r\t:]*?)";機能しないのですか?*?とはどう違い*ますか?

機能しますが、空の文字列に一致する可能性があるため、各文字と個々の文字の間の空の文字列に一致します。

*?は、0 個以上の文字に一致するが可能な限り少ない文字に一致する遅延量指定子であることに注意してください。数量化された文字クラスが、パターンの残りの部分が成功するために必要な数の文字のみに一致することが保証されます。他の正規表現フレーバーでは、正の先読みを使用できますが(?=:)、re2 はルックアラウンドをサポートしていません。

遅延マッチングの詳細については、rexegg.comおよびregular-expressions.infoを参照してください。

于 2015-09-09T22:35:22.417 に答える
0

入力用

"123.45.34.5:8080". 「123.45.34.5」

この正規表現は8080を返します:

:([0-9]+)

入力用

「123.45.34.5」。「123.45.34.5」

これはcharが存在するかどうかをチェック:します..存在しないため、何も返しません:

(\:)
于 2015-09-09T18:26:19.227 に答える