0

私は現在、この正規表現と一致させようとしています:

^(?<Date>(0[1-9]|[12][0-9]|3[01])[/.](0[1-9]|1[012])[/.](19|20)\d\d) (?<Time>(?:(?:(\d+):)?(\d+):)?(\d+)): (?<Name>.*) (?<IP>\([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}:[0-9]?[0-9]?[0-9]?[0-9]?[0-9]?[0-9]?\)) (?<GUID>.*) - (?<Line>#([0-9]?[0-9]?[0-9]?[0-9]?)) (?<Code>.*)\n(?<Code2>(\n|.)*)

これを入力として:

08.08.2012 01:47:40: ferngully (98.169.247.118:2304) 6ff0e06c6d5434a953b2780f852bf762 - #17 "moveIn", 
"land", 
"addWPCur", 
"animate", 
"setDate", 
"playmusic", 
"playsound", 
"switchmove", 

08.08.2012 01:47:40: Thugnificent (72.86.3.240:50218) 696089009a4e885fe5ec0323d4537253 - #0 f)')};
                                        BIS_ALICE_fnc_houseEffects = compile preprocessFileLineNumbers '\ca\modules\alice\d
08.08.2012 01:36:28: [SOER]MrWolf (58.110.48.174:2304) 464f91fcefe7f1014979c5140a0f1649 - #12 airing..."] call d_fnc_VehicleChat};
_object setDamage 0;
sleep d_reload_time_factor;
if (!alive _ob

この問題は、1つの一致のみを返すことです。これは、3つの一致として一致できる必要があります。

最後の目標は、日付、時刻、名前、IP、GUID、行、そして複数行のコードを含む、これらの「ヘッダー」のそれぞれの間にコードをプルできるようにすることです。

編集:

問題を解決しました。2日目に先読みを使用する必要があります。

現在の正規表現:

^(?<Date>(0[1-9]|[12][0-9]|3[01])[/.](0[1-9]|1[012])[/.](19|20)\d\d?) (?<Time>(?:(?:(\d+):)?(\d+):)?(\d+)?): (?<Name>.*?) (?<IP>\([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}:.*?\)?) (?<GUID>[0-9a-z]{32}?) - (?<Line>#[0-9]*?) (?<Code>(\n|.)*?)(?=(0[1-9]|[12][0-9]|3[01])[/.](0[1-9]|1[012])[/.](19|20)\d\d)
4

3 に答える 3

1

問題は、 のさまざまな使用法です.*。これは可能な限り一致します (貪欲な一致)。したがって、この場合Name(私が思うに)、最後のエントリの IP の直前まで一致し続けます。

一致を非貪欲にするには、 を使用します.*?。これは、一致させるためにできるだけ少なく使用するように指示します。これにより、マッチング中にエントリ全体を飲み込もうとしなくなります。

于 2012-08-08T09:53:49.887 に答える
1

を使用して正規表現をコンパイルし、文字列の先頭だけでなく、各行の先頭と一致RegexOptions.Multilineさせる必要があります。^

(?m)または、プリコンパイルされた正規表現を使用していない場合は、正規表現の先頭に追加できます。

もちろん、正規表現を一致させるには正しい方法を使用する必要があります(@ stemaの回答を参照)。

于 2012-08-08T09:54:07.407 に答える
1

どの方法を使用していますか? Regex.Match() を使用していると思われます

次の可能性があります。

  1. Regex.Match()

    指定された入力文字列を検索して、Regex コンストラクターで指定された正規表現の最初の出現を探します。

    Matchオブジェクトを返します。Match.NextMatch()を使用して、次の一致を取得できます

  2. Regex.Matches()

    正規表現のすべての出現について、指定された入力文字列を検索します。

    見つかったすべての一致を含むMatchCollectionをMatchオブジェクトとして返します

于 2012-08-08T09:47:04.767 に答える