Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以进一步优化我的正则表达式吗?还是我做得对?_C#_Regex - Fatal编程技术网

C# 我可以进一步优化我的正则表达式吗?还是我做得对?

C# 我可以进一步优化我的正则表达式吗?还是我做得对?,c#,regex,C#,Regex,好的,我正在使用html,我想匹配CMS生成的两条注释之间的所有内容,包括换行符 例如: <!-- Start Magic --> <h2>My title</h2> <p>Here's some content</p> <p>And hey look, a linebreak! And here's another for good measure! </p> <!-- End Magic -->

好的,我正在使用html,我想匹配CMS生成的两条注释之间的所有内容,包括换行符

例如:

<!-- Start Magic -->
<h2>My title</h2>
<p>Here's some content</p>
<p>And hey look, a linebreak!
And here's another for good measure!
</p>
<!-- End Magic -->
这是我用来提取内脏的正则表达式:

Regex.Match(magic, @"<!-- Start Magic -->(?<guts>[\s\S]*?)<!-- End Magic -->");

现在我应该注意到这实际上很好。我只是想知道是否使用[\s\s]*?是以非贪婪方式匹配所有内容(包括换行符)的最佳方式。

如果要以非贪婪方式匹配所有内容

@"<!-- Start Magic -->(.*?)<!-- End Magic -->"

应该有用。但不要测试它。

我相信\s\s等同于。如果在C中可以使用“忽略空白”修饰符,则还有另一种使用RegexOptions的方法,如下所示:

Regex.match(magic, @"<!-- Start Magic -->.*?<!-- End Magic -->", RegexOptions.SingleLine);
使用RegexOptions.SingleLine,您将通知C正则表达式引擎更改点的含义,以便它匹配每个字符,而不是默认值,即每个字符都不匹配\n


这并不是最好的解决方法,因为这是相当主观的,包括性能和可读性等考虑因素

问题是它会停在一条换行线上,对吗?是的,弗兰兹,你是对的。除了换行符外,其他都匹配。抱歉丹尼尔:没关系,在这里每天都能学到新东西真是太好了。是的,我最近对这个地方很上瘾。我刚开始学习C,我必须说,在这里学习真的加速了我的学习!而且-被接受的答案使用你的*?建议,只需添加使引擎忽略换行符的修改器,就可以了:只是为了完成:该修改器是m.Hmmm。。。我会调查的。在过去和今天,我总是使用\s\s,无论出于什么原因,我在想,我是否在编写WTF代码,有没有更好的方法?。所以我想我应该试着找出答案:老实说,我很喜欢你的解决方案。这是一种很酷的方式,可以让你一直忘记修饰语;嘿,弗兰兹,谢谢你的回答和评论,这是一次有趣的讨论:。我给了David接受,因为他提供了在C中引入m修饰符的方法。但是如果你在C中,[\s\s]*?除非您使用的代码超过4个,否则代码会更短。哈哈,这没问题。我对C语言的结果也很感兴趣。你不需要正则表达式。单线?穆拉里:这就是他使用[\s\s]解决方法的原因\s将匹配包括换行符在内的所有空白,而\s是对\s的精确否定。因此,上面的表达式匹配包括换行符在内的任何字符串。好吧,这是m修饰符的C等价物?是的,天哪,我错过了perl。这就是我多年前第一次遇到正则表达式概念的地方。.*模式可能应该通过添加问号来实现非贪婪,以防万一,尽管这在本应用程序中可能并不重要-理论上,这将是更好的实践,也可能更快。我同意-可能会更快,如果您有两个end magic实例,几乎可以肯定会避免一个bug——我将简化代码。谢谢。事实上,它是s修饰符的C等价物。也就是说,s是Perl使用的,而大多数其他风格都复制Perl。但是有些人称之为DOTALL模式,这是一个比singleline更好的名字。为了让我们保持警觉,Ruby对该模式使用了m修饰符,并称之为multiline。