RegEx позитивный взгляд за повторяющиеся результаты - PullRequest
2 голосов
/ 16 января 2020

Я пытаюсь использовать положительный вид сзади (. net flavour), чтобы заменить все одиночные символы, окруженные пробелами, когда строка содержит текст «[must_contain_this_word]», заключенный в такие скобки, но регулярное выражение кажется остановка после первого совпадения. Я хочу сохранить слово в квадратных скобках и все слова, которые не являются одиночными символами. Я думаю, что я начал в правильном направлении, но не уверен, как заставить его повторить поиск до конца строки

Мое регулярное выражение:

(?:(?=\[must_contain_this_word\])(.*?)\s[a-zA-Z]\s)

Замена: " $1"

мой ввод:

[must_contain_this_word] text1 a text2 b text3 c

мой желаемый вывод:

[must_contain_this_word] text1 text2 text3

1 Ответ

0 голосов
/ 21 января 2020

Вы можете использовать позитивное решение на основе :

(?<=\[must_contain_this_word].*?)\s+[a-zA-Z](?!\S)

Заменить пустой строкой. См. regex demo online .

Подробности

  • (?<=\[must_contain_this_word].*?) - позитивный взгляд, который гарантирует, что есть фраза [must_contain_this_word] и затем любые 0 или более символов, кроме новой строки, как можно меньше непосредственно слева от текущего местоположения
  • \s+ - 1+ пробелов
  • [a-zA-Z] - одна буква ASCII ( используйте \p{L}\p{M}* для сопоставления с любой буквой Юникода, включая необязательные диакритические знаки после нее)
  • (?!\S) - отрицательный прогноз, который не дает совпадения, если справа от текущего местоположения есть непробельный символ.

C# демо :

var pattern = @"(?<=\[must_contain_this_word].*?)\s+[a-zA-Z](?!\S)";
var s = "[must_contain_this_word] text1 a text2 b text3 c";
Console.WriteLine(Regex.Replace(s,pattern, ""));
// => [must_contain_this_word] text1 text2 text3
...