需要一些C#正则表达式帮助

时间:2011-07-06 03:00:03

标签: c# .net regex

我正在尝试提出一个正则表达式,它将在</ol>的第一次出现时停止。我当前的RegEx类型有效,但仅当</ol>两端都有空格时。例如,不是停在下面一行的第一个实例,而是停在第二个

some random text <a href = "asdf">and HTML</a></ol></b> bla </ol>

以下是我目前正在使用的模式:string pattern = @"some random text(.|\r|\n)*</ol>";

我做错了什么?

5 个答案:

答案 0 :(得分:3)

string pattern = @"some random text(.|\r|\n)*?</ol>";

请注意明星之后的问号 - 告诉它非贪婪,这基本上意味着它会尽可能地捕获 little ,而不是贪婪尽可能很多

答案 1 :(得分:2)

通过添加?让你的外卡“不合适”。 e.g。

some random text(.|\r|\n)*?</ol>
                          ^- Addition

这将使正则表达式匹配尽可能少的字符,而不是匹配尽可能多的(标准行为)。

哦,正则表达式不应该解析[X] HTML

答案 2 :(得分:1)

虽然不是正则表达式,但为什么不简单地使用子串函数,如:

string returnString = someRandomText.Substring(0, someRandomText.IndexOf("</ol>") - 1);

这似乎比提出正则表达式涵盖所有可能的字符,空格等更容易。

答案 3 :(得分:0)

此正则表达式匹配从字符串开头到第一个</ol>的所有内容。它使用Friedl的“展开循环”技术,因此非常有效:

Regex pattern = new Regex(
    @"^[^<]*(?:(?!</ol\b)<[^<]*)*(?=</ol\b)",
    RegexOptions.IgnoreCase);
resultString = pattern.Match(text).Value;

答案 4 :(得分:0)

其他人已经解释了失踪的?以使量词非贪婪。我想建议另一个改变。

我不喜欢你的(.|\r|\n)部分。如果在交替中只有单个字符,则更容易制作字符类[.\r\n]。这是做同样的事情,它更好阅读(我不知道编译器明智,也许它也更有效)。

在您的特殊情况下.的替代品只是新行字符时,这也不是正确的方法。在这里你应该这样做:

Regex A = new Regex(@"some random text.*?</ol>", RegexOptions.Singleline);

使用Singleline修饰符。它只是使.匹配也是换行符。