Regex условно позитивный взгляд - PullRequest
2 голосов
/ 17 февраля 2020

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

У меня есть строки с текстом вроде этого

$array['key']['FirstWord']
$array['key']['FirstWord SecondWord']
$array['key']['FirstWord SecondWord ThirdWord']
$array['key']['FirstWord SecondWord ThirdWord FourthWord']

Список может быть продолжен. Я хочу сопоставить (выбрать) пробелы между внутренними ключевыми словами. Во второй строке это будет пробел между FirstWord и SecondWord.

С ^\$array\['key'\]\['(?:\w+ +)+ Я могу сопоставить строки, содержащие более одного слова в ключе. Поместив первую часть (?<=^\$array\['key'\]\[') как позитивный взгляд, я могу поставить «маркер» как раз перед тем, как начнутся ключевые слова, и тогда я потерялся. Я думал об использовании границ слов и затем выбирал что-нибудь между ними, но пока безуспешно. Любые предложения или указатели?

РЕДАКТИРОВАТЬ: Предполагается, что между этими строками также будет какой-то другой текст, поэтому простой \b не будет работать как регулярное выражение.

1 Ответ

4 голосов
/ 17 февраля 2020

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

Вы соответствуете либо ^\$array\['key'\]\[', либо вы соответствуете еще 1 символам слова и забудьте, что в настоящее время сопоставляется, используя \K

Затем сопоставьте 1 или более горизонтальных пробельных символов.

(?:^\$array\['key'\]\['(?=.*?'])\w+|\G(?!^))\w+\K\h+
  • (?: Группа без захвата
    • ^\$array\['key'\]\[' Совпадение $array['key']['
    • (?=.*?']) Позитивный взгляд, утверждаю '] справа
    • \w+ Совпадение с 1 + символами слова
    • | Или
    • \G(?!^) Утверждение позиции в конце предыдущего матча, а не в начале
  • ) Закрыть группу без захвата
  • \w+ Матч Символы 1+
  • \K Сброс начальной точки указанного совпадения (забудьте, что было найдено)
  • \h+ Совпадение 1+ горизонтальных пробелов

Regex demo

...