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、行,然后是多行代码。

编辑:

我解决了这个问题,我需要在第二个日期使用前瞻。

当前正则表达式:

^(?<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

您使用哪种方法?我怀疑你正在使用 Regex.Match()

你有这种可能性:

  1. 正则表达式.Match()

    在指定的输入字符串中搜索 Regex 构造函数中指定的正则表达式的第一次出现。

    返回一个匹配对象。您可以使用Match.NextMatch()获得下一场比赛

  2. 正则表达式匹配()

    在指定的输入字符串中搜索所有出现的正则表达式。

    返回包含所有找到的匹配项的MatchCollection作为Match对象

于 2012-08-08T09:47:04.767 回答
1

问题将是您对.*. 这将尽可能匹配(贪婪匹配)。所以在这种情况下Name(我认为)将一直匹配到最后一个条目中的 IP 之前。

为了使匹配不贪婪,请使用.*?. 这告诉它尽可能少地使用来进行匹配。这将确保它不会在匹配时尝试吞噬整个条目。

于 2012-08-08T09:53:49.887 回答
1

您需要编译正则表达式RegexOptions.Multiline以允许^匹配每行的开头,而不仅仅是字符串的开头。

或者(?m),如果您不使用预编译的正则表达式,您可以在正则表达式的开头添加。

当然,您需要使用正确的方法来匹配正则表达式(请参阅@stema 的答案)。

于 2012-08-08T09:54:07.407 回答