Форум программистов, компьютерный форум, киберфорум
PHP: RegExp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153

Разбиение строки по символу с "отрицанием"

12.12.2017, 20:47. Показов 1620. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу регулярку для разбиения строки по символу "запятая", но ту которая не помещена в апострофы с любым количеством пробелов. Т.е разбиение по запятой, а та запятая что в апострофах, не рассматривалась бы как символ разбиения, а как собственно символ и помещалась бы в массив

написал
PHP
1
preg_split('/(?!\'),(?!\')/'.'u', $string)
для строки вида
PHP
1
$string="f, g , h, ',', j, k";
работает корректно
получаю массив
PHP
1
2
3
4
5
6
7
8
Array(
[0] = f
[1] = g
[2] = h
[3] = ','
[4] = j
[5] = k
);
Но если апостроф лежит вплотную к предыдущей запятой, (как после буквы h)
PHP
1
$string="f, g , h,',', j, k";
то получаю некорректное разбиениы
PHP
1
2
3
4
5
6
7
Array(
[0] = f
[1] = g
[2] = h,','
[3] = j
[4] = k
);
то-же самое, если между апострофами и запятой есть пробелы, f, g , h, ' , ', j, k то получаю тоже некорректное разбиение
Array(
[0] = f
[1] = g
[2] = h
[3] = '
[4] = '
[5] = j
[6] = k
);

Что нужно добавить в выражение? Как-то тяжело мне дается регулярка)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.12.2017, 20:47
Ответы с готовыми решениями:

Разбиение строки по заданному символу
Привет форумчане! Подскажите как реализовать такую ситуацию: - имеем к примеру строку ;abcd;efgh;ijklm;nopqrs и т.д. хоть сколько...

Разбиение читаемого из файла текста на строки по заданному символу
Добрый вечер. Подскажите как реализовать переход на новую строку

Разбиение строки на слова - вынести разбиение в отдельную функцию
задача из Яндекс Практикума(вроде простая, но нет). Я уже два дня пытаюсь это реализовать, написал несколько вариантов, работают. Но...

9
1137 / 685 / 412
Регистрация: 07.11.2015
Сообщений: 1,102
13.12.2017, 00:54
Лучший ответ Сообщение было отмечено SergTN как решение

Решение

Исходные данные в формате CSV? Если да, то есть штатные средства под этот формат http://php.net/manual/ru/function.str-getcsv
PHP
1
$a = str_getcsv($string, ',', "'");
Если хочется разбирать регуляркой:
PHP
1
2
3
$string="f, g , h, '10,000', j, k";
$a = preg_split("/\G(?:[^,']+|'[^']*')*+\K,/", $string);
print_r($a);
1
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153
13.12.2017, 20:35  [ТС]
Цитата Сообщение от Emilien Посмотреть сообщение
preg_split("/\G(?:[^,']+|'[^']*')*+\K,/", $string)
Вот спасибо ! Вы просто волшебник! Работает как часы)
По отдельным классам и символам выражения вроде понимаю, а как это все вместе работает не доходит)
А правильно-ли модификатор u (для UTF-8) так добавить:
PHP
1
preg_split("/\G(?:[^,']+|'[^']*')*+\K,/".'u'
?
0
1137 / 685 / 412
Регистрация: 07.11.2015
Сообщений: 1,102
13.12.2017, 20:53
Да, для работы с UTF-8 стоит добавить модификатор u.
Шаблон захватывает всё до ближайшей запятой, а последовательность \K используется для сброса начала совпадения http://php.net/manual/ru/regex... escape.php
0
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153
13.12.2017, 22:06  [ТС]
Пробую теперь выбрать все что внутри этих крайних апострофов
/\b'(.+)'\b/
-работат только на внутренних апострофах, а не на внешних. Пробовал на http://easyregexp.ru/constructor
Ничего не понимаю
0
1137 / 685 / 412
Регистрация: 07.11.2015
Сообщений: 1,102
13.12.2017, 22:55
Цитата Сообщение от SergTN Посмотреть сообщение
Пробую теперь выбрать все что внутри этих крайних апострофов
/\b'(.+)'\b/
-работат только на внутренних апострофах, а не на внешних. Пробовал на http://easyregexp.ru/constructor
Ничего не понимаю
\b - граница слова. Ей соответствует позиция между двумя символами текста, когда один из них является символом слова, а другой – нет.
К символам слова относят состав метасимвола \w т.е. буквы, цифры и подчёркивание.
Кавычка не является символом слова.
Фрагмент \b' может совпасть только если перед кавычкой окажется буква, цифра или подчёркивание.
Аналогично '\b для совпадения после кавычки нужна буква, цифра или подчёркивание.
.+ по умолчанию квантификаторы жадные и эта конструкция захватит максимум текста аж до самой последней кавычки.
1
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153
14.12.2017, 00:19  [ТС]
наверное здесь проще вырезать обычными строковыми функциями обойтись -т.к. по идее для регулярки это несложная замена?

Добавлено через 4 минуты
Цитата Сообщение от Emilien Посмотреть сообщение
Фрагмент \b' может совпасть только если перед кавычкой окажется буква, цифра или подчёркивание.
Аналогично '\b для совпадения после кавычки нужна буква, цифра или подчёркивание.
а для первого или последнего слова в строке эта граница сработает? Я сейчас не про символ ' а про общий случай
0
1137 / 685 / 412
Регистрация: 07.11.2015
Сообщений: 1,102
14.12.2017, 04:06
Лучший ответ Сообщение было отмечено SergTN как решение

Решение

Цитата Сообщение от SergTN Посмотреть сообщение
а для первого или последнего слова в строке эта граница сработает? Я сейчас не про символ ' а про общий случай
Граница слова совпадает с позицией перед первым символом текста, если первый символ является символом слова.
И с позицией после последнего символа текста, если последний символ является символом слова.


Цитата Сообщение от SergTN Посмотреть сообщение
наверное здесь проще вырезать обычными строковыми функциями обойтись -т.к. по идее для регулярки это несложная замена?
Проще сразу воспользоваться str_getcsv, fgetcsv.


Цитата Сообщение от SergTN Посмотреть сообщение
Пробую теперь выбрать все что внутри этих крайних апострофов
/\b'(.+)'\b/
С помощью preg_match_all и сброса нумерации в ветвлении (?|...) можно сразу получить значение без этих крайних апострофов.
PHP
1
2
3
$string="f, g , h, '10,000', j, k";
preg_match_all("/(?|([^,']+)|'([^']*)')(?:\s*,\s*|$)/u", $string, $a);
print_r($a[1]);
1
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153
14.12.2017, 20:44  [ТС]
Огромное спасибо!
Правда, еще более стал паттерн непонятнее) Можно поподробнее прокоментировать этот кусочек:
Цитата Сообщение от Emilien Посмотреть сообщение
..)(?:\s*,\s*|$)/u"
0
1137 / 685 / 412
Регистрация: 07.11.2015
Сообщений: 1,102
16.12.2017, 18:04
Там или захват пробельных символов вокруг запятой или конец строки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.12.2017, 18:04
Помогаю со студенческими работами здесь

Поиск целочисленных - Негативный просмотр назад (с отрицанием) и Негативный просмотр вперёд (с отрицанием)
Здравствуйте! Тут нашел шаблон поиска целочисленных чисел в строке вот такой: (?<!\.)\b+\b(?!\.). На этой основе попробовал написать...

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

Закодировать сообщение в виде строки с помощью операции «исключающее или» применяемой к каждому символу строки
Задание 2. 1. Требуется закодировать сообщение в виде строки с помощью операции «исключающее или» применяемой к каждому символу строки...

Обращение к символу строки
bool book::func(QString &text) { } Допустим есть такая функция. Необходимо проверить 3 символ строки,является ли он символом...

Разделение строки по символу в массив
Всем привет! Мне надо написать функцию, которая разделяет строку по какому-то разделителю и записывает в массив, вот что у меня получилось:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru