2017-01-09 3 views
0

У меня естьПолучите самые короткие подстроки между двумя multicharacter разделителей с C# регулярное выражение

string text = "aa aa value kk 8718764 aa value1 kk kk kk 5178gkjh aathtkhkk"; 

Я хочу, чтобы все тексты между aa и kk и ожидаемыми результатами являются:

1 = value 
2 = value1 
3 = thtkh 

Пытаюсь с помощью "aa(.*?)kk" regex, но я не получаю ожидаемого результата.

ответ

1

.*? по-прежнему соответствует aa между aa и kk.

Используйте tempered greedy token:

aa((?:(?!aa).)*?)kk 
    ^^^^^^^^^^^^^ 

или

aa((?:(?!aa|kk).)*)kk 
    ^^^^^^^^^^^^^^^ 

Смотрите regex demo

Детали:

  • aa - aa подстрока
  • ((?:(?!aa).)*?) - Группа 1 захвата любой ноль или более символов (если RegexOptions.Singleline опция используется, даже включая символ новой строки), которые не начинают последовательность aa подстроки, как можно
  • kk - в kk подстроки

enter image description here

C# code:

var re = @"aa((?:(?!aa).)*?)kk"; 
var str = "aa aa value kk 8718764 aa value1 kk kk kk 5178gkjh aathtkhkk"; 
var res = Regex.Matches(str, re) 
    .Cast<Match>() 
    .Select(p => p.Groups[1].Value) 
    .ToList(); 
+0

Можно ли объяснить var re :) Это отличный ответ –

+0

На самом деле это умеренный жадный токен в разделителях, и ответ, который я связал, объясняет это очень хорошо. Я также добавил короткое объяснение здесь. –