2014-07-24 166 views
1

我想文本两个标记之间的匹配/标签后面一看:如何使贪婪

-- #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正则表达式来做到这一点

(?s)(?<=-- #begin free text\s*)(?<freeText>(.+?))(?=\s+-- #end free text) 

相反以“这是......”开头的匹配,它与前面两个回车符相匹配,即“\ n \ n这就是...”

如何确保前面的回车符最多n个)不包括在内在比赛中?

回答

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模式,允许点到跨线
  • 的回顾后(?<=-- #begin free text\s*)起始定界符和可选的空间
  • \S匹配匹配的非空间字符匹配(启动匹配)
  • .*?懒惰地匹配任何字符到...
  • 一个位置,其中的前瞻(?=\s*-- #end free text)可以断言,接下来是可选的空白字符结束结尾分隔符
+0

供参考:新增说明。 :) – zx81

+0

伟大的\ S做到了。我不得不修改你的正则表达式以包含组名:(?s)(?<= - #begin free text \ s *)(?(\ S。*?))(?= \ s + - #end免费文字) – openshac

+0

+1真的很好解释 – anubhava

1

你真的需要lookarounds吗?这个工作对我来说:

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

Lookarounds是无价的,当你需要的时候,但大多数时候他们只是你的方式。这对于.NET正则表达式来说更是如此,他们的“任何事情都是向后看”,但它仍然适用。