2012-08-08 74 views
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) 

回答

1

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

为了使比赛非贪婪使用.*?。这告诉它尽可能少地使用匹配。这将确保它不会在匹配时吞噬整个条目。

+0

除非他明确设置'RegexOptions.Singleline'标志,否则这是不正确的,因为默认情况下点不匹配换行符。 – 2012-08-08 09:55:35

+0

这是真的。我忘记了那种事情。不过,他可能会这样做,所以它可能会有所帮助。 :) – Chris 2012-08-08 10:01:43

+0

这是在多行字符串搜索中搜索确切字符串直到找到匹配的最简单和最优雅的方式。 – Hahnemann 2017-04-01 14:42:25

1

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

你有这样的可能性:

  1. Regex.Match()

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

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

  2. Regex.Matches()

    搜索指定的输入字符串的正则表达式中出现的所有拿到下一场比赛我的。

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

+0

不错的猜测,尽管这一点还不够。 – 2012-08-08 09:56:28

1

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

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

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

+0

+1当然你是对的,忽略了这一点。 – stema 2012-08-08 10:00:46

相关问题