Как я могу использовать lookbehind в регулярном выражении C#, чтобы пропустить совпадения повторяющихся шаблонов префиксов?

как я могу использовать lookbehind в регулярном выражении C#, чтобы пропустить совпадения повторяющихся шаблонов префиксов?

пример-я пытаюсь, чтобы выражение соответствовало всем b символы, следующие за любым количеством a символы:

Regex expression = new Regex("(?<=a).*");

foreach (Match result in expression.Matches("aaabbbb"))
  MessageBox.Show(result.Value);

возвращает aabbbb, lookbehind, соответствующий только a. Как я могу сделать так, чтобы он соответствовал всем as в начале?

Я пробовал

Regex expression = new Regex("(?<=a+).*");

и

Regex expression = new Regex("(?<=a)+.*");

без результатов...

что я ожидаю bbbb.

3 ответов


вы ищете повторную группу захвата?

(.)*

это вернет два матча.

дано:

aaabbbb

в результате:

aaa
bbbb

Это:

(?<=(.))(?!).*

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

что соответствует:

bbbb

в конце концов я понял:

Regex expression = new Regex("(?<=a+)[^a]+");

foreach (Match result in expression.Matches(@"aaabbbb"))
   MessageBox.Show(result.Value);

Я не должен допустить, чтобы as для меня соответствует группе не-lookbehind. Таким образом, выражение будет соответствовать только тем b повторений, которые следуют a повторений.

соответствующего aaabbbb доходность bbbb и соответствующего aaabbbbcccbbbbaaaaaabbzzabbb результаты bbbbcccbbbb, bbzz и bbb.


причина, по которой look-behind пропускает "a", заключается в том, что он потребляет первое "a" (но не захватывает его), а затем захватывает остальное.

будет ли этот шаблон работать для вас вместо этого? Новый шаблон:\ba+(.+)\b Он использует слово boundary \b закрепить оба конца слова. Он соответствует по крайней мере одному "а", за которым следуют остальные символы, пока не закончится граница слова. Остальные символы записываются в группу, чтобы вы могли ссылаться на них легко.

string pattern = @"\ba+(.+)\b";

foreach (Match m in Regex.Matches("aaabbbb", pattern))
{
    Console.WriteLine("Match: " + m.Value);
    Console.WriteLine("Group capture: " + m.Groups[1].Value);
}

обновление: если вы хотите пропустить первое вхождение любой дублированные буквы, затем соответствуют остальной части строки, вы можете сделать это:

string pattern = @"\b(.)()*(?<Content>.+)\b";

foreach (Match m in Regex.Matches("aaabbbb", pattern))
{
    Console.WriteLine("Match: " + m.Value);
    Console.WriteLine("Group capture: " + m.Groups["Content"].Value);
}