Как я могу использовать 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
. Как я могу сделать так, чтобы он соответствовал всем a
s в начале?
Я пробовал
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);
Я не должен допустить, чтобы a
s для меня соответствует группе не-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);
}