C# 使用正则表达式查找块中的文本

C# 使用正则表达式查找块中的文本,c#,regex,C#,Regex,我有一个文本块,如下所示 #start Line 1 Line 2 Line 3 #end *--Similar blocks-* 我用过这个 Regex.Matches(text,@"#start(.*?)#end",RegexOptions.Multiline) 上面这个块的正则表达式 问题是,当我尝试通过记事本++查找选项匹配这个正则表达式时,它是有效的,但通过C#Regex.Matches函数它失败了 我不知道到底是什么问题。但希望你们能帮助我!:) 点字符匹配除换行符以外的任何字

我有一个文本块,如下所示

#start
Line 1
Line 2
Line 3
#end

*--Similar blocks-*
我用过这个

Regex.Matches(text,@"#start(.*?)#end",RegexOptions.Multiline)
上面这个块的正则表达式

问题是,当我尝试通过记事本++查找选项匹配这个正则表达式时,它是有效的,但通过C#Regex.Matches函数它失败了


我不知道到底是什么问题。但希望你们能帮助我!:)

点字符匹配除换行符以外的任何字符。因此,它将不匹配
#start
初始字符串之后的任何内容。尝试以下正则表达式:
#开始(.|\s)+?#结束
(已测试)

由其他用户的注释/答案指出,另一个更简单的解决方案是激活“单行”正则表达式选项,强制正则表达式匹配点字符为<强>任何字符,包括NeXLIWW字符< /强>。这将允许OP的原始正则表达式在没有修改的情况下使用。单行正则表达式模式可以通过传递

RegexOptions来激活。在匹配正则表达式时,单行
选项,如下所示:


Regex.Matches(文本,@“#start(.*)#end”,RegexOptions.Singleline)

您需要一个
单行
正则表达式模式。尝试此代码,它将在
#start
#end

var input = @"#start
Line 1
Line 2
Line 3
#end

#start
Line 4
Line 5
Line 6
#end";

var reges = new Regex("#start(.*?)#end", RegexOptions.Singleline);
var blocks = reges.Matches(input).Cast<Match>();
foreach (var block in blocks)
    Console.WriteLine(block.Groups[1].Value);
var输入=@“#开始
第1行
第2行
第3行
#结束
#开始
第4行
第5行
第6行
#结束”;
var reges=new Regex(“#start(.*)#end”,RegexOptions.Singleline);
var blocks=reges.Matches(input.Cast();
foreach(块中的var块)
Console.WriteLine(block.Groups[1].Value);

另一种方法-只需在末尾添加a/s修饰符。谢谢,这就像一个符咒:)这是一个非常低效的解决方案。永远不要使用
(.|\s)+?
,它会使每个正则表达式变慢,并会降低代码性能。使用
RegexOptions.Singleline
仅使用
。因此,您可以使用
@(?s)#start(.*?)#end“
@“#start(?s:.*?)#end”
,或
新的正则表达式(#start(.*?#end),RegexOptions.Singleline)
我重点解释了OP最初的解决方案不起作用的原因,而不是性能方面。我正在更新答案以包含这些观察结果。欢迎新用户!这可能也会有帮助。您应该使用
RegexOptions。也可以使用Singleline
。“MultiLine”选项不是必需的,但“Singleline”是必需的。我明天将尝试此代码,并会让您知道:)