我正在尝试提出一个正则表达式,它将在</ol>
的第一次出现时停止。我当前的RegEx类型有效,但仅当</ol>
两端都有空格时。例如,不是停在下面一行的第一个实例,而是停在第二个
some random text <a href = "asdf">and HTML</a></ol></b> bla </ol>
以下是我目前正在使用的模式:string pattern = @"some random text(.|\r|\n)*</ol>";
我做错了什么?
答案 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
修饰符。它只是使.
匹配也是换行符。