Найти все фразы, заключенные в ("") и слова без ("") в выражении - PullRequest
3 голосов
/ 04 октября 2019

Используемый язык: PHP

Допустим, у меня есть такое выражение:

Ayala NOT ("Ayala Station" OR "Ayala Branch" OR "Joey Ayala")

И я хочу извлечь следующие слова:
- Айяла
- Станция Айяла
- Филиал Айяла и
- Джои Айала

Я хочу получить все фразы, заключенные в двойные кавычки "" и отдельные слова, такие как Ayala в приведенном выше примере, но не удалось выполнить эксперименты

Испытано несколько регулярных выражений

1-я попытка:

"([^"]+)" - я знаю, что это регулярное выражение является правильным для получения слов/ фразы внутри двойной кавычки

2-я попытка:

~\w+(?:-\w+)*~ - это регулярное выражение получит все слова из данного выражения или строки

3-я попытка:

Комбинируя 2 попытки выше "([^"]+)"|~\w+(?:-\w+)*~ - я смог создать свои сценарии использования для желаемого результата, но с этими 2 объединенными, Ayala слово не извлекается

Пример игровой площадки regex101

4-я попытка:

Пробовал использовать "([^"]+)"|\S+, но он включает специальные символы

4th Attempt

Я что-то упустил с регулярным выражением?

1 Ответ

1 голос
/ 04 октября 2019

В правой части чередования не должно быть разделителей регулярных выражений - разделители регулярных выражений должны быть только вокруг всего шаблона (рядом с разделителями строк PHP). Например,

"([^"]+)"|\w+(?:-\w+)*

Если вы хотите захватить все матчи одновременно, без групп захвата, вы можете использовать

(?<=")\b[^"]+(?=")|\w+(?:-\w+)*

https://regex101.com/r/nP6wM5/10

Чтобы исключить НЕ и ИЛИ в самом регулярном выражении, используйте:

(?<=")\b[^"]+(?=")|\b(?!(?:NOT|OR)(?!-))\w+(?:-\w+)*

для их отрицательного просмотра прямо перед сопоставлением автономных слов.

...