Регулярное выражение для поиска слов в тексте

Есть необходимость создать такое регулярное выражение, которое бы искало в тексте все слова с чёрточкой (например: механик-водитель, лётчик-испытатель, Санкт-Петербург, тук-тук и т. п.), но при этом исключало бы из поиска конкретные слова с чёрточкой (например: из-за, кое-как, кому-либо, по-настоящему и т. п.). Спасибо!


Ответы (2 шт):

Автор решения: becouse
  1. Находим все слова с дефисом. В PHP, например, regex_full_match

    ([а-яА-ЯёЁ]+-[а-яА-ЯёЁ]+)

  2. Имеем словарь "стоп-слов".

  3. Исключаем из найденных слов все слова из списка "стоп-слов"

Писать сразу регулярное выражение, в котором будет список "стоп-слов" не эффективно.

→ Ссылка
Автор решения: Total Pusher

Спасибо! А всё-таки как добавить к этому выражению список "стоп-слов"?

Нужно использовать отрицательное look-behind условие

Пример на PHP:

$text = "механик-водитель, лётчик-испытатель, Санкт-Петербург,
тук-тук из-за, кое-как, кому-либо, по-настоящему";

if(preg_match_all('~\b[а-яё]+-[а-яё]+\b(?<!из-за|кое-как|кому-либо|по-настоящему)~iu',
  $text, $m)) {
    var_dump($m);
}

Вывод:

array(1) {
  [0]=>
  array(4) {
    [0]=>
    string(31) "механик-водитель"
    [1]=>
    string(33) "лётчик-испытатель"
    [2]=>
    string(29) "Санкт-Петербург"
    [3]=>
    string(13) "тук-тук"
  }
}
→ Ссылка