正则表达式:在预定义标记之间读取

时间:2012-06-13 16:41:04

标签: .net regex

我很茫然,我需要一些帮助。

字符串如下:

"Hello World

@start some text @end

@start more text @end"

我需要一个正则表达式模式,它匹配从@start到第一个@end的任何内容。在这个例子中,我们将有两个匹配(@start (some text) @end)。 @标签内的文本可以包含换行符。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

此代码:

string s = "Hello world\n@start text1 @end\n@start text2 @end";
Regex r = new Regex(@"(?<=@start)[\s\S]*?(?=@end)");
var mm = r.Matches(s);

制作了2场比赛。

技巧是:

  • 使用非贪婪匹配(*?而不仅仅是*
  • 使用[\s\S]来匹配任何字符,包括换行符
  • 使用lookahead / lookbehind((?...)

答案 1 :(得分:0)

编辑:(得到*?倒退。修理它。)

(?<=@start).*?(?=@end)

编辑:哎呀,制作单行

&#34;&#34;默认情况下不会匹配换行符,但您可以启用此换行符。如何做到这一点取决于您使用的正则表达式引擎,但通常它被称为&#34;单行&#34;

编辑:看到你正在使用.NET。试试这个:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace RegexSandboxCSharp {
  class Program {
    static void Main(string[] args) {

      string l_input = @"Hello World  

@start some text @end  

@start more text @end";


      // This is the relevant piece of code:    
      MatchCollection l_matches = Regex.Matches( l_input, "(?<=@start).*?(?=@end)", RegexOptions.Singleline );



      foreach ( Match l_match in l_matches ) {
        Console.WriteLine( l_match.Value );
      }

      Console.ReadKey( true );

    }
  }
}