我目前正在尝试与此正则表达式匹配:
^(?<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)
答案 0 :(得分:1)
您使用的是哪种方法?我怀疑你使用的是Regex.Match()
你有这种可能性:
在指定的输入字符串中搜索Regex构造函数中指定的第一次出现的正则表达式。
返回Match个对象。您可以使用Match.NextMatch()
在指定的输入字符串中搜索所有正则表达式。
返回MatchCollection,其中包含所有找到的匹配项Match
答案 1 :(得分:1)
问题在于.*
的各种用途。这将尽可能多地匹配(贪婪匹配)。因此,在这种情况下,Name
(我认为)将保持匹配,直到最后一个条目中的IP之前。
要使匹配非贪婪,请使用.*?
。这告诉它尽可能少地使用匹配。这将确保在匹配时不会尝试吞噬整个条目。
答案 2 :(得分:1)
您需要使用RegexOptions.Multiline
编译正则表达式,以允许^
匹配每行的开头,而不仅仅是字符串的开头。
如果你没有使用预编译的正则表达式,你可以在正则表达式的开头添加(?m)
。
当然,您需要使用正确的方法来匹配正则表达式(请参阅@stema的答案)。