powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как написать регулярное выражение, не захватив фразы в кавычках
17 сообщений из 17, страница 1 из 1
Как написать регулярное выражение, не захватив фразы в кавычках
    #40070667
drynny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно заменить все слова между запятыми, не заключенные в кавычки, ими же, но в кавычках. Не могу выбрать слова без кавычек.
Вроде, нужно look-ahead использовать, но он не укладывается в мою голову никак.
Подскажете?
Спасибо!

...
Рейтинг: 0 / 0
Как написать регулярное выражение, не захватив фразы в кавычках
    #40070668
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drynny,

Я бы сделал в два захода обычной заменой без регулярок:
Код: sql
1.
REPLACE(CONCAT('\'', REPLACE(field, ',', '\',\'), '\''), '\'\'','\'')
...
Рейтинг: 0 / 0
Как написать регулярное выражение, не захватив фразы в кавычках
    #40070669
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно и в обратном порядке - сначала удалить все кавычки, а потом расставить их.
...
Рейтинг: 0 / 0
Как написать регулярное выражение, не захватив фразы в кавычках
    #40070674
drynny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

Это да, я тоже хотел сплитом обойтись и заменой. Но пользователи будут вставлять запятые между кавычками, и тут без регулярки уже никак - нужно будет парные кавычки вычислять.
...
Рейтинг: 0 / 0
Как написать регулярное выражение, не захватив фразы в кавычках
    #40070675
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drynny
Но пользователи будут вставлять запятые между кавычками
А кавычки откуда берутся?
Рассказывайте уж всю задачу, а не ваше видение ее решения.
...
Рейтинг: 0 / 0
Как написать регулярное выражение, не захватив фразы в кавычках
    #40070678
drynny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

Ок, есть задача фильтровать таблицы, задавая список возможных значений. Чаще это делается с фронта по api и там всегда есть кавычки, потому что фильтруемые значения могут содержать запятые.
Иногда пользователь хочет выбрать руками несколько значений и задать фильтр, а я ему хочу облегчить задачу - не заставлять ставить кавычки.

...
Рейтинг: 0 / 0
Как написать регулярное выражение, не захватив фразы в кавычках
    #40070679
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drynny,

Т.е. строку "in(api,mp)" пользователь вводит руками?
И там может быть что-то типа "in(aa,'bb,cc')" ?

Тогда я бы сделал свою функцию с циклом и проходом по строке (простенький конечный автомат).
Заодно будет можно четко диагностировать ошибки синтаксиса.
...
Рейтинг: 0 / 0
Как написать регулярное выражение, не захватив фразы в кавычках
    #40070683
drynny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft
drynny,

Т.е. строку "in(api,mp)" пользователь вводит руками?
И там может быть что-то типа "in(aa,'bb,cc')" ?

Тогда я бы сделал свою функцию с циклом и проходом по строке (простенький конечный автомат).
Заодно будет можно четко диагностировать ошибки синтаксиса.


Пользователь может ввести руками, да. И там не будет ни кавычек, ни запятых. А вот по api может прилететь
in('Васин, Пупкин и партнеры', 'Петров-Дебоширов')
...
Рейтинг: 0 / 0
Как написать регулярное выражение, не захватив фразы в кавычках
    #40070706
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проще будет забыть о регулярках и сделать потоковый разбор, символ за символом. За примерами - смотри как CSV читается.
...
Рейтинг: 0 / 0
Как написать регулярное выражение, не захватив фразы в кавычках
    #40070782
drynny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Проще будет забыть о регулярках и сделать потоковый разбор, символ за символом. За примерами - смотри как CSV читается.


Мне кажется, что не будет проще. На регулярках нужно написать ещё несколько кракозябр всего, а тут надо целый алгоритм городить.
...
Рейтинг: 0 / 0
Как написать регулярное выражение, не захватив фразы в кавычках
    #40070811
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drynny
White Owl
Проще будет забыть о регулярках и сделать потоковый разбор, символ за символом. За примерами - смотри как CSV читается.


Мне кажется, что не будет проще. На регулярках нужно написать ещё несколько кракозябр всего, а тут надо целый алгоритм городить.
Ну можно вот так извратиться. Если подготовить твою оригинальную строку слегка, то потом можно и попытаться.
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#!/usr/bin/perl
$in = "in(aaa,'bbb,ccc','ddd',eee,fff,gg'gg)";

print "$in -> ";
$in =~ s/in\(//;
$in =~ s/\)//;
$in .= ',';
print "$in\n";

while ($in =~ /('[^']+'|[^'].*?),|\)/g) {
	print $1, "\n";
}


Хотя потоковый, посимвольный разбор все равно проще будет и для понимания и для поддержки.
...
Рейтинг: 0 / 0
Как написать регулярное выражение, не захватив фразы в кавычках
    #40070841
drynny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
drynny
пропущено...


Мне кажется, что не будет проще. На регулярках нужно написать ещё несколько кракозябр всего, а тут надо целый алгоритм городить.
Ну можно вот так извратиться. Если подготовить твою оригинальную строку слегка, то потом можно и попытаться.
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#!/usr/bin/perl
$in = "in(aaa,'bbb,ccc','ddd',eee,fff,gg'gg)";

print "$in -> ";
$in =~ s/in\(//;
$in =~ s/\)//;
$in .= ',';
print "$in\n";

while ($in =~ /('[^']+'|[^'].*?),|\)/g) {
	print $1, "\n";
}


Хотя потоковый, посимвольный разбор все равно проще будет и для понимания и для поддержки.


Спасибо! Взбодрили.

Вот такое в итоге состряпал:
...
Рейтинг: 0 / 0
Как написать регулярное выражение, не захватив фразы в кавычках
    #40070850
drynny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Но есть косяк - кириллица как-то влияет на границы слова, вроде, ошибочно захватывается
...
Рейтинг: 0 / 0
Как написать регулярное выражение, не захватив фразы в кавычках
    #40070860
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drynny
Но есть косяк - кириллица как-то влияет на границы слова, вроде, ошибочно захватывается
Потому что кириллица может считаться псевдографикой для конкретной недоделанной библиотеки регулярных выражений.
Ты на каком языке пишешь? Тамошняя re умеет в юникод? Твоя исходная строка в юникоде?

Повторюсь еще раз: в данной задаче проще и надежней сделать посимвольный разбор строки.
Регулярки конечно круть, но далеко не панацея.
...
Рейтинг: 0 / 0
Как написать регулярное выражение, не захватив фразы в кавычках
    #40070864
drynny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
drynny
Но есть косяк - кириллица как-то влияет на границы слова, вроде, ошибочно захватывается
Потому что кириллица может считаться псевдографикой для конкретной недоделанной библиотеки регулярных выражений.
Ты на каком языке пишешь? Тамошняя re умеет в юникод? Твоя исходная строка в юникоде?

Повторюсь еще раз: в данной задаче проще и надежней сделать посимвольный разбор строки.
Регулярки конечно круть, но далеко не панацея.


Точняк, включил юникод, кириллица норм, но есть проблема с пробелами. Надо что-то вместо \b использовать, т.к. тут границы слов есть внутри текста.
...
Рейтинг: 0 / 0
Как написать регулярное выражение, не захватив фразы в кавычках
    #40070875
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drynny
Точняк, включил юникод, кириллица норм, но есть проблема с пробелами. Надо что-то вместо \b использовать, т.к. тут границы слов есть внутри текста.
А зачем тебе вообще \b?
И чем плохо выражение которое я показал?
...
Рейтинг: 0 / 0
Как написать регулярное выражение, не захватив фразы в кавычках
    #40070890
drynny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
drynny
Точняк, включил юникод, кириллица норм, но есть проблема с пробелами. Надо что-то вместо \b использовать, т.к. тут границы слов есть внутри текста.
А зачем тебе вообще \b?
И чем плохо выражение которое я показал?


\b уже не годится, я понял.
Твоё выражение я не могу применить в preg_replace (у меня там бэкенд на PHP).

Одна команда же лучше, чем алгоритм.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как написать регулярное выражение, не захватив фразы в кавычках
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]