2013-09-17 3 views
-2

мне нужно, чтобы получить все матчи в данном слове, используя регулярное выражение (т.е. все комбинации)Как получить все матчи с помощью регулярных выражений

Содержание:

ABC

Из этого я нужно получить AB и BC, когда я даю некоторый узор, например [AZ] [AZ]. Теперь он дает только «AB» в качестве сопоставленного шаблона.

Заранее спасибо

+0

Вы совершенно не поняли, что Regex для .. Похоже, вы хотите алгоритм перестановки .. не Regex. –

+0

еще одна домашняя работа? –

+0

@SimonWhitehead, по-видимому, некоторые регулярные выражения (.net) поддерживают его .. :) – Anirudha

ответ

1

Вы можете использовать предпросмотр так, что вы не потребляете матчей:

(?=([A-Z]{2})) 

ideone demo.

+0

он отлично работает для меня. @Jerry. Считаете ли вы, что возникнут какие-либо проблемы, если мы будем использовать это? –

+0

Это так здорово :) –

+0

@kumar Как видно сейчас, не совсем, но безопаснее предположить, что это будет зависеть от определенных ситуаций. Иногда некоторые определенные изменения могут потребоваться для определенного конкретного ввода. – Jerry

2
int i = 0; 
List<Match> matches = new List<Match>(); 
while(i < input.Length){ 
    Match m = Regex.Match(input.Substring(i),"[A-Z]{2}"); 
    if(m.Success){ 
    matches.Add(m); 
    i += m.Index+1; 
    }else break; 
} 

Вы также можете осуществить его, чтобы поддержать lazy соответствия, как это:

public static IEnumerable<Match> Matches(string input, string pattern) { 
     int i = 0; 
     while (i < input.Length){ 
      Match m = Regex.Match(input.Substring(i), "[A-Z]{2}"); 
      if (m.Success) { 
       yield return m; 
       i += m.Index + 1; 
      } 
      else yield break; 
     } 
} 
//Use it 
var matches = Matches(input, "[A-Z]{2}"); 
+1

как обычно, здесь для сохранения ... –

1

.NET поддерживает захват группы в lookarounds

var result=Regex.Matches(input,"(?=(..))") 
       .Cast<Match>() 
       .Select(x=>x.Groups[1].Value); 
-2
int i = 0; 
List<Match> matches = new List<Match>(); 
while(i < input.Length){ 
    Match m = Regex.Match(input,"[A-Z][Z-A]"); 
    if(m.Success){ 
    matches.Add(i++); 
    i = m.Index ++ 1; 
    } 
} 
+1

скомпилирует? – Anirudha

+0

Просьба представить объяснение с вашим кодом, чтобы другие могли узнать. – RedEyedMonster

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