Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2019, 09:14   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию Помогите дописать регулярное выражение

Здравствуйте.
У меня на входе следующие строки:
Код:
АКБ TAB POLAR S (Asia), R + 35Ah, En300 (196 x 134 x 205-226) правый + , днищевая планка:b00
Аккумулятор Bosch (J)ТК S4 Silver 40Ah, EN 330 левый + 187x127x228 (ДхШхВ)
Подчёркнутое нужно оттуда выдрать.
Для упрощения регулярки делаю такой предфильтр:
Код:
$upperCase_name=strtoupper($inputStr); // на входе встречается разный регистр нужных данных даже в пределах одной строки
$upperCase_name=str_replace(' X','X',$upperCase_name);
$upperCase_name=str_replace('X ','X',$upperCase_name);
$upperCase_name=str_replace(' -','-',$upperCase_name);
$upperCase_name=str_replace('- ','-',$upperCase_name);
Вооружившись генератором, и различными страничками синтаксиса регулярных выражений - составил такие два регулярных выражения:
Код:
[\d]{1,}[X]{1}[\d]{1,}[X]{1}[\d]{1,}[-]{1}[\d]{1,} // первый пример
[\d]{1,}[X]{1}[\d]{1,}[X]{1}[\d]{1,} // второй пример
Обе регулярки работают как надо, но только по отдельности - надо сначала проверять по первой, и если ничего нет - то по второй.
Как можно запихнуть всё это в одну регулярку ?
Что то вроде сделать не обязательным блок
Код:
[-]{1}[\d]{1,}
Я знаю как делать не обязательный символ, как это сделать для целого блока регулярного выражения ? Группировка со скобками не работает.

P. S. Так же я знаю, что можно сделать регулярку без предфильтра, но пока пусть будет так.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 11.09.2019, 09:22   #2
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Только что перепроверил, заработала группировка со скобками
Код:
[\d]{1,}[X]{1}[\d]{1,}[X]{1}[\d]{1,}([-]{1}[\d]{1,})?
Но так же обнаружил, что регулярка хватает не полное последнее число по второму примеру. Как это можно вылечить ?
Нужно что бы ловила только все символы (числовые, согласно имеющийся регулярке), не зависимо от их количества.

UPD: можно добавить [^\d]{1} - но будет отлавливать первый символ за числом, и это ещё пол беды - его можно отбросить потом. Главная проблема заключается в том, что "ограничитель" нужно добавлять для двух вариантов (см. примеры), и тогда работать только двумя регулярками.
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 11.09.2019 в 10:04.
OmegaBerkut вне форума Ответить с цитированием
Старый 11.09.2019, 11:13   #3
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Сообщение полностью изменено.
В части регулярных выражений проблему кое-как решил. в четыре регулярки
Но теперь я упёрся в проблему многобайтовости UTF-8, и сложностей работы со всем этим =)
Теперь выяснилось, что в качестве разделителя чисел у меня есть строки с русскими Х. И функция str_replace здесь почему-то безсильна.
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 11.09.2019 в 22:35.
OmegaBerkut вне форума Ответить с цитированием
Старый 11.09.2019, 23:08   #4
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Ага, я опять решил проблему сам ...
Что-бы не было проблем с кириллицей - нужно сначала выполнить все операции именно с кириллицей, а потом выполнять остальные операции.
В моём случае, функция strtoupper убивала кириллицу, из-за чего функция str_replace не могла заменить нужные символы.
Проблему регистра и кириллицы одновременно решаются функцией str_ireplace. Но если сильно надо - можно два раза вызвать функцию str_replace для замены кириллических символов верхнего и нижнего регистра.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 12.09.2019, 08:20   #5
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

А вот так вроде проще
Код:
((\d+\s*[x,X,х,Х]\s*){2}(\d+(\s+-?\s+\d+)*))
х - русские и английские варианты
И параметры для регекса gmu

Количество пробелов между элементами можно любое.
Изображения
Тип файла: png Безымянный.png (16.8 Кб, 46 просмотров)
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.

Последний раз редактировалось WorldMaster; 12.09.2019 в 08:23.
WorldMaster вне форума Ответить с цитированием
Старый 12.09.2019, 14:59   #6
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
А вот так вроде проще
Да, может и проще ...
Но здесь не учитываются варианты что нужный фрагмент может быть в конце строки. Добавим необязательный блок - получаем те самые 2 регулярки.

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Количество пробелов между элементами можно любое
Должно быть в итоге 0. Какая разница, буду ли я потом вызывать trim, или же сначала выполню отсев пробелов ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 12.09.2019, 15:09   #7
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Но здесь не учитываются варианты что нужный фрагмент может быть в конце строки.
С чего бы это вдруг?? Не имеет значения в какой части строки будет фрагмент.

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Должно быть в итоге 0. Какая разница, буду ли я потом вызывать trim, или же сначала выполню отсев пробелов ?
trim как правило удаляет вначале и в конце строки. Для данной реги не имеет значение когда вы будете удалять пробелы. К тмоу же тут учтено что вмесо пробела может присутствовать какой либо невидимый символ.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 18.09.2019, 04:09   #8
uberchel
Участник клуба
 
Аватар для uberchel
 
Регистрация: 19.01.2009
Сообщений: 1,455
По умолчанию

Код:
/(\d+\s?x\s?+\d+\s?x\s?+\d+[0-9-]+)/u

Последний раз редактировалось uberchel; 18.09.2019 в 04:14.
uberchel вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите составить регулярное выражение Metrologik JavaScript, Ajax 1 08.11.2017 15:28
Регулярное выражение Xo66um Общие вопросы C/C++ 11 12.05.2016 16:23
Перл - Помогите написать регулярное выражение. Троллев Помощь студентам 0 12.04.2016 00:35
Помогите подобрать регулярное выражение в Питоне DarknessLORD11 Помощь студентам 0 20.12.2015 23:12
Помогите составить регулярное выражение V-alterman Общие вопросы по Java, Java SE, Kotlin 0 04.12.2014 11:46