[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Переносы слов знаком "-". Регулярные выражения.
Denis Tar
Помогите составить регулярку, которая должна искать (и ПРОПУСКАТЬ) в тексте знаки переноса слов "-" (обычная "черточка"/"минус"). Никак не могу придумать конструкцию для слов, которые требуется пропускать из поиска.
Интересует комбинация из выражений, содержащих цифры, например "1980-х", "2-этажный", "50-процентный" и т. п.
Требуется пропускать именно слова, где перед "-" стоит цифра, а не буква.
Выражение вида (\d-) или ([^0-9]-) пропускает числительные, однако не может быть использовано для слов, вроде "какоЙ-нибудь", "чтО-либо", "гдЕ-то", поскольку захватывает предшествующую знаку "-" букву, а этого мне не нужно.
- Для таких случаев составлена своя регулярка, ищущая частицы слов "нибудь", "либо", "то" и др., следующих после знака "-".
Как для этого можно использовать "Отрицательное назад смотрящее" (?!=), если вообще можно - и с какой стороны от "-" его ставить?
FatCat
Цитата (Denis Tar @ 12.10.2016 - 11:37)
искать (и ПРОПУСКАТЬ) в тексте знаки переноса слов "-" (обычная "черточка"/"минус").

Команда исключения из поиска - не символ "минус", а пара символов "пробел-минус".
Чтобы работало и для первого слова, добавить пробел перед строкой запроса.

_____________
Бесплатному сыру в дырки не заглядывают...
Denis Tar
Цитата (FatCat @ 12.10.2016 - 12:43)
Команда исключения из поиска - не символ "минус", а пара символов "пробел-минус".

Считаем, что текст на предмет "пробелов" нормализован.
речь идет именно о дефисах-переносах слов.

ВСЯ ЗАДАЧА ЦЕЛИКОМ (для понимания практического применения).
Имеется
текст со знаками переносов слов "-" (дефис/минус, не тире; уже заранее лишенный окружения пробелами).
В тексте есть множество слов, каждое из которых требуется привести к виду без переносов - там, где это требуется по правилам языка; соответственно, сохранив написание составных слов, пишущихся через "дефис".
Для этого в редакторе открываем "Заменить" - и осуществляем поиск не всех "-" (поверьте, в 50 МБ чистого неформатированного текста, их встречается ОООЧЕНЬ много) с заменой на "" (пустую строку), а лишь тех, которые не попадают под прописанные Правила (т. е. требуют оценки заменять/пропускать уже вручную).
Обязательные к удалению знака "-" слова: "го-род, вен-тиляция, так-же, коллек-ционер" и т. д.
(в таких "дефис" находим - и удаляем заменой на "пустышку").
Правила, при которых пропускаем слова с переносами:
1. Букво-содержащие частицы, вроде: "как-то, какой-нибудь, что-либо" и др. (здесь регулярку я написал - и она работает);
2. Числительные: 1980-й, 11-классник, 9-е, 16-этажный; 8-495-123-4567, т. е. те, в которых перед "-" содержится цифра.
Конструкции вида (\d-\d) не имеют смысла, поскольку будут выделять цифры слева и справа от "-", т. е. лишают затею логики вовсе
(т. к. вместо замены "-" на "пустышку" придется обработать еще и цифры слева, справа: 8-495-123-4567).
FatCat
Цитата (Denis Tar @ 12.10.2016 - 13:05)
1. Букво-содержащие частицы, вроде: "как-то, какой-нибудь, что-либо" и др. (здесь регулярку я написал - и она работает);

"вагон-ресторан" и "кресло-качалка" тоже обработает правильно?

_____________
Бесплатному сыру в дырки не заглядывают...
Denis Tar
Цитата (FatCat @ 12.10.2016 - 13:21)
"вагон-ресторан" и "кресло-качалка" тоже обработает правильно?

- Это как-раз-таки к исключениям, исправляемым собственноручно относим.
А вообще словарь часто входящих слов - я сам пополняю по мере встречаемости слов.
Вы болтать будете или советом поможете?
FatCat
Я не пользуюсь регулярками там, где мне удобней циклами и строковыми функциями, поэтому буду болтать.

Я бы разбил по пробелу на массив слов и работал со словами. Первым делом, отрезать падежные окончания, и проверить по словарю. Вторым делом проверить слева от дефиса на число.
Обрезка падежных окончаний, мои наработки.
	function clean_y_value($v){
$v = strtolower($v);
if( strlen($v)>8 and in_array(substr($v,-6),array("овская","евская")) )$v = substr($v,0,-6);
elseif( strlen($v)>7 and in_array(substr($v,-5),array("аться","яться","иться","ается","яется","енный","енная","енное")) )$v = substr($v,0,-5);
elseif( strlen($v)>6 and in_array(substr($v,-4),array("ться","аюсь","яюсь","евый","ёвый","овый","овой","евая","ёвая","овая","евое","ёвое","овое","евые","ёвые","овые","ость","есть","йный","йная","ящий","ящая","ящие","вный","вная")) )$v = substr($v,0,-4);
elseif( strlen($v)>5 and in_array(substr($v,-3),array("ать","ять","ить","ого","оем","ому","ает","яет")) )$v = substr($v,0,-3);
elseif( strlen($v)>4 and in_array(substr($v,-2),array("ів","ам","ая","ее","ей","ий","ие","их","ию","ия","ми","ов","ое","ой","ок","ом","оя","ую","ые","ый","ых","ья","ям","ях","яя")) )$v = substr($v,0,-2);
elseif( strlen($v)>3 and in_array(substr($v,-1),array("a","e","i","а","е","и","й","о","у","ы","ь","ю","я","э")) )$v = substr($v,0,-1);
return $v;
}


_____________
Бесплатному сыру в дырки не заглядывают...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.