如何看看贪婪的背后

时间:2014-07-24 09:26:50

标签: .net regex regex-lookarounds regex-greedy

我正在尝试匹配两个标记/标记之间的文本:

-- #begin free text

this is the first bit of text I want to match
blah blah blah
this is the end of the matching text

-- #end free text

我已设法使用以下.Net Regex

执行此操作
(?s)(?<=-- #begin free text\s*)(?<freeText>(.+?))(?=\s+-- #end free text)

而不是以“this is the ......”开头的匹配,它也匹配前两个回车符,即“\ n \ n这是......”

如何确保匹配中不包含前面的回车符(最多n个)?

2 个答案:

答案 0 :(得分:1)

使用此:

(?s)(?<=-- #begin free text\s*)\S.*?(?=\s*-- #end free text)

在C#中:

var myRegex = new Regex(@"(?s)(?<=-- #begin free text\s*)\S.*?(?=\s*-- #end free text)", RegexOptions.Multiline);
string resultString = myRegex.Match(yourString).Value;
Console.WriteLine(resultString);

比赛:

this is the first bit of text I want to match\nblah blah blah\nthis is the end of the matching text

<强>解释

  • (?s)激活DOTALL模式,允许点跨行匹配
  • lookbehind (?<=-- #begin free text\s*)匹配起始分隔符和可选空格
  • \S匹配非空格字符(开始匹配)
  • .*?懒惰地匹配任何字符......
  • 前瞻(?=\s*-- #end free text)可以断言后面的内容是可选的空白字符结束结尾分隔符的位置

答案 1 :(得分:1)

你真的需要外表吗?这对我有用:

Regex r = new Regex(
    @"(?s)-- #begin free text\s+(?<freeText>(.+?))\s+-- #end free text");
text = r.Match(subjectString).Groups["name"].Value;

当你需要它们时,外观非常宝贵,但大部分时间它们都会妨碍你。对于.NET正则表达式来说,这更不正确了。&#34;任何事情都会发生。 lookbehinds,但它仍然适用。