2012-08-08 70 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

相關問題