2016-01-10 36 views
2

例如,我們有以下字符串:正則表達式匹配,通過多條線路

Something 
AnotherThing 
Something AnotherThing 

如果我使用RegexOptions.Singleline與模式Something.+?AnotherThing然後我得到的兩場比賽時,我想只匹配第一和第二線。我想用FirstLine#endofline##startofline#AnotherLine之類的東西。所以我使用:

var regex = new Regex(@"Something$^AnotherThing", RegexOptions.Multiline); 

但它不起作用。我知道我可以在Singleline中使用一些破解來匹配前兩行(而不是最後一行),但問題是:如果沒有Singleline說明符,只有多行選項,甚至可以精確匹配兩行中的確切兩個文本?爲什麼它的行爲如此。

+1

你可以試試' ^(Something [\ s] + AnotherThing)'.. – choz

+0

它也會匹配最後一行。看到明顯的答案,它滿足我的需求 –

回答

4

如何:

Something\r?\nAnotherThing 

\r?的情況下,字符串並非來自Windows操作系統。

原因Something$^AnotherThing不與RegexOptions.Multiline選項工作,是因爲^$在換行符匹配,而不是換行本身,所以下面將工作:

new Regex(@"Something$\r?\n^AnotherThing", RegexOptions.Multiline); 
+0

如果只有換行符('\ n'),'$ \ r?\ n ^'將起作用,但如果還有回車符('\ r \ n'),則不起作用。 .NET在Perl派生的正則表達式中獨一無二,因爲它僅將**'\ n'識別爲行分隔符(Unicode標準[[更加包含]](http://www.unicode.org/reports/TR18 /#Line_Boundaries))。但無論你使用哪種風味,如果你必須匹配行分隔符,'^'和'$'只是混亂。 –

0

嘗試使用回車符和換行符來匹配,例如,

Something\r?\nAnotherThing 

基本上,回車造成你的麻煩(你並不孤單)。你知道你的文本來自哪個操作系統嗎?如果它來自Windows,那麼\ n之前會有一個\ r,您需要考慮這一點。

+1

在這種情況下'\ r $'在這種情況下不起作用,因爲'$ ^'不起作用:您需要*消費*換行符,但'$'只是聲明在那。 –