正则表达式匹配任何行的任何字符,直到我们达到某个匹配

时间:2012-08-08 08:37:00

标签: .net regex

我目前正在尝试与此正则表达式匹配:

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

3 个答案:

答案 0 :(得分:1)

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

你有这种可能性:

  1. Regex.Match()

      

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

    返回Match个对象。您可以使用Match.NextMatch()

  2. 获取下一场比赛
  3. Regex.Matches()

      

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

    返回MatchCollection,其中包含所有找到的匹配项Match

答案 1 :(得分:1)

问题在于.*的各种用途。这将尽可能多地匹配(贪婪匹配)。因此,在这种情况下,Name(我认为)将保持匹配,直到最后一个条目中的IP之前。

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

答案 2 :(得分:1)

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

如果你没有使用预编译的正则表达式,你可以在正则表达式的开头添加(?m)

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