2012-06-13 5 views
0

Я в затруднении, мне нужна помощь.Регулярное выражение: чтение между предопределенными токенами

Строка выглядит следующим образом:

"Hello World 

@start some text @end 

@start more text @end" 

мне нужен шаблон регулярного выражения, которое будет соответствовать ничего от @start к первому @end. В этом примере у нас было бы два матча (@start (some text) @end). Текст внутри тегов @ может содержать символ новой строки.

Любые идеи?

+0

@start {1} (. * \ N) + @ end {1}. Проблема заключается в части (. * \ N) +, поскольку она соответствует концу. Этот шаблон возвращает одно совпадение (начало некоторого конца текста начало большего текста) – mtm927

+0

Попробуйте нежелательную версию с '. *?' Вместо '. *'. Кстати, зачем вам '{1}' s? – Vlad

+0

Не имеет значения :( – mtm927

ответ

1

Этот код:

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

произвел 2 матча.

Трюки являются:

  • использование нежадным соответствия (*? вместо того, чтобы просто *)
  • использование [\s\S], чтобы соответствовать действительно любой символ, включая символ новой строки
  • использование опережения/просмотра назад ((?...))
0

EDIT: (получил * назад фиксируя его?..)

(?<[email protected]).*?([email protected]) 

EDIT: Упс, сделать что SingleLine

"" по умолчанию не будут соответствовать новостям, но вы можете включить это. Как это сделать, зависит от того, какой механизм регулярных выражений вы используете, но обычно он называется «singleline»

EDIT: пила, что вы используете .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, "(?<[email protected]).*?([email protected])", RegexOptions.Singleline); 



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

     Console.ReadKey(true); 

    } 
    } 
} 
Смежные вопросы