2016-12-05 2 views
3

Я создаю приложение, и у меня есть требование захватить символы до и после матчей. Кажется, что это работает нормально, за исключением случаев, когда в соседнем захвате есть несколько совпадений.Capture Text Surrounding Regex Match .NET

Regex:

.{0,10}(?=abc) 

Это должно захватить до 10 символов перед строкой "ABC" найден.

Проблема появляется, если есть повторение матча в предыдущем тексте:

"qqqqabcabcqqq" 

С выше текст, я ожидал бы два Протоколируется:

qqqq (the 4 characters before the first abc occurrence) 
qqqqabc (the 7 characters before the second abc occurrence) 

я не являюсь, однако получая эти матчи. Единственное совпадение, которое я получаю:

qqqqabc 

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

мне нужно регулярное выражение, которое:

1. для .NET

2. Смотрит в строке для X символов перед точным соответствием на строки S .

3. Включает любой вторичный матч на S (вызов S '), что находится в пределах X символов перед S

4. все равно, каковы эти персонажи.

Уверяю вас, я попробовал найти похожие ответы, но я не смог найти ничего, что бы непосредственно отвечало на этот вопрос (который преследовал меня в течение двух дней. Да, я должен использовать регулярное выражение). Что касается аромата Regex, я работаю в .NET.

Большое вам спасибо за помощь.

+0

Престола [это демо] (http://regexstorm.net/tester?p=%28.%7b0%2c10%7d%3f%29abc&i=qqqqabcabcqqq): целое совпадение - 'qqqqabc', а группа 1 -' qqqq'. –

+0

Я сразу посмотрю на это. Огромное спасибо. Я не думаю, что могу пометить ваш комментарий как ответ, хотя :) –

+0

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

ответ

2

Здесь:

(?<=(?<CharsBefore>.{0,10}))(?=abc) 

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

Regex test

Demo in C#

Я изменил путь ваш первоначальный вариант работал немного.

Надеюсь, это поможет!

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

(?<=(.{0,10}))(?=abc) 
+0

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