2016-01-10 30 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 $'在这种情况下不起作用,因为'$ ^'不起作用:您需要*消费*换行符,但'$'只是声明在那。 –