2013-02-11 49 views
0

仍然在學習正則表達式,並且無法讓我的頭部纏繞在lookahead概念上。類似的數據,在這裏我的問題 - Matching multiple lines up until a sepertor line?,說我有用戶交給我下面幾行:正則表達式 - 通過換行符查看模式

0000AA.The horizontal coordinates are valid at the epoch date displayed above. 
0000AA.The epoch date for horizontal control is a decimal equivalence 
0000AA.of Year/Month/Day. 
0000AA 
[..] 

所以一個很簡單的正則表達式是@^[0-9]{4}[A-Z]{2}\.(?<noteline>.*),那裏會給我的每一行。太棒了。 :)但是,我想要一個lookahead(或一個條件?),它會查看下一行,並告訴我該行是否帶有'。'的代碼。 (即如果下一行會匹配@^[0-9]{4}[A-Z]{2}[^\.]

試圖先行,我得到第一個兩行命中(因爲以下行有「」代碼後),但不是最後一次。

編輯:使用上面的正則表達式,或者下面提供的正則表達式給了我所有的行,但是我想知道如果一個空行(以AA0000代碼行,但是之後沒有'。'行),例如,當我開始在線上的匹配of Year/Month/Day,我想知道IF該行後面跟着一個空行(或不是)(與分組名稱不是空格或空的,用於高級示例)

編輯2:我可能會誤用'lookahead'術語。回顧.NET的正則表達式,我看到一些被稱爲交替構造的東西,但不確定是否可以在這裏使用它。

謝謝!
Mike。

回答

0

在做了大量的研究工作後,我已經確定它不能完成 - 或者說 - 它可以但是會非常困難 - 更容易在代碼中完成。

爲了避免,我在查看多行字符串(文檔),其中每行行前面有一個6位數的代碼。有些行 - 我感興趣的行 - 有一個'。'在6位代碼後,然後打開文本。我希望有一種方法可以讓我在一個組中的每一行,以及一個標誌讓我知道,如果下一行沒有自由文本輸入。 (6位代碼後面的「否」。)兩行數據輸入會給我兩個文件上的匹配。第一場比賽將在線組中的文字稱爲'notetext',而'lastline'則爲空。第二行將在'notetext'中輸入註釋的第二部分,並且組'lastline'將會有東西(任何東西,內容無關緊要)。

從我所瞭解的,lookaheads是零寬度斷言,所以如果匹配,可返回值仍然是空的。如果不使用lookahead,'lastline'的匹配會消耗下一行的代碼,使'notetext'跳過該行(給我每行其他文本行)。所以,我需要一些反向引用來還原回到。

到了這個時候,簡單地獲取所有行,並在文本結尾處添加文本會更容易(代碼明瞭)。 (循環遍歷整個文檔,它不能超過200行,而不是循環通過正則表達式匹配的行,並且爲將來的修改讀取代碼的難易程度將超出正則表達式可能給我帶來的任何輕微速度優勢。

謝謝你們! - -Mike

0

應用選項RegexOptions.Multiline。它改變了^$的含義,使它們匹配ervery行的開始和結尾,而不是整個字符串的開始和結尾。

var matches = Regex.Matches(input, 
          @"^[0-9]{4}[A-Z]{2}\..*$?(?!^[0-9]{4}[A-Z]{2}[^.])", 
          RegexOptions.Multiline); 

負前瞻是

find(?!suffix) 

它匹配的位置不是前述的後綴。請勿在方括號[ ]內轉義點。無論如何,括號都禁用了大多數字符的特殊含義。

我還添加了.*$?使模式匹配直到當前行結束。需要?才能製作*懶惰。否則,它是貪婪,這意味着將嘗試獲得儘可能多的字符,並可能一次匹配幾行。


如果您只需要數字部分,您可以通過將其包含在圓括號中將其捕獲在一個組中。

(^[0-9]{4}[A-Z]{2})\..*$?(?!^[0-9]{4}[A-Z]{2}[^.]) 

然後就可以拿到小組這樣

string number = match.Groups[1].Value; 

注:組#0表示整場比賽。

+0

謝謝,我是用多,我忘了提,這工作,但忽略了問題的要點(我不好,因爲我並不清楚。 )我編輯我的問題更清晰了! – Coyttl 2013-02-11 21:11:11

+0

我的示例返回的行不是在行後面有一個沒有點的數字的行之後,它是空白行的意思嗎?如果您的意思是行只有一個數字你可以通過'(?!^ [0-9] {4} [AZ] {2} $)'來改變負向預測,如果行s '(?!^ $)'完全可以。 – 2013-02-11 21:43:40