2014-12-08 2 views
-1

Добрый день! Я работаю над переводчиком LOLCODE и у меня беда в этой строке:Как создать регулярное выражение для повторяющегося шаблона

SMOOSH "A" AN "B" AN "C" AN "D" 

Мне нужно, чтобы получить строковые литералы A, B, C, D, но я получил только первый и последние два литералы.

Вот мой код:

r = new Regex(@"(\s+)?(?<smoosh>SMOOSH)\s+(\""(?<yarn1>[^\""]+).*)\s+(\""(?<yarn2>[^\""]+).*)(\s+)?((\s+)(AN)?(\""(?<yarn3>[^\""]+).*))+(\s+)?(?<comment>BTW\s*.*\s*)?$"); 

мне нужно, чтобы держать все строковые литералы, так что я мог сцепить это позже. Спасибо заранее.

+0

Каков ваш ожидаемый результат? –

+0

Как насчет 'lolcode.Split(). Где (token => token.StartsWith (" \ "") && token.EndsWith ("\" "))'? –

ответ

0

Вы можете использовать группы захвата.

@"""([^""]*)""" 

И получить строку, которую вы хотите от индекса группы 1.

Regex rgx = new Regex(@"""([^""]*)"""); 
foreach (Match m in rgx.Matches(input)) 
Console.WriteLine(m.Groups[1].Value); 

ИЛИ

Использование \G якоря. \G утвердите позицию в конце предыдущего совпадения или в начале строки для первого совпадения. Он захватывает значения внутри двойных кавычек только на линиях, которые содержит строку SMOOSH

@"(?:(?:\s+)?(?<smoosh>SMOOSH)\s+|(?<!^)\G) *(?:AN)* *""?([^""\n]*)""?" 

Код:

String input = @"SMOOSH ""A"" AN ""B"" AN ""C"" AN ""D"""; 
Regex rgx = new Regex(@"(?:(?:\s+)?(?<smoosh>SMOOSH)\s+|(?<!^)\G) *(?:AN)* *""?([^""\n]*)""?"); 
foreach (Match m in rgx.Matches(input)) 
Console.WriteLine(m.Groups[1].Value); 

IDEONE

1

Попробуйте это:

Regex re = new Regex(@"""(.*?)"""); 
MatchCollection mc = re.Matches(sourcestring); 
     int mIdx=0; 
     foreach (Match m in mc) 
     { 
     for (int gIdx = 0; gIdx < m.Groups.Count; gIdx++) 
      { 
      Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames()[gIdx], m.Groups[gIdx].Value); 
      } 
     mIdx++; 
     } 

Вы получите все литералы в массиве.

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