Форум программистов, компьютерный форум, киберфорум
Lua
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 10

Тонкости регулярок на lua

13.10.2014, 19:14. Показов 3354. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть строка: "Мед1, Мед2 (а1, 2), Мед3, Мед4"

Нужно переписать либо такую регулярку: /[А-я\d]+(\s\([А-я\d, ]*\))?/g

Здесь проблема, что скобки работают немного не так, как в остальных языках. Он, напротив, возвращает только выражение в скобках, хотя находит всё выражение:
Lua
1
2
3
for str in string.gmatch("Med, Ved", 'ed(,)?') do
  print(str)
end
Либо такую регулярку: /[А-я\d]+\s\([А-я\d, ]*\)|[А-я\d]+/g

Тут проблема заключается в том, что почему-то некорректно обрабатывается "|". По идее выражение должно читаться: «Либо это выражение, либо это». Но оно просто выдает, кажется, пустую строку.
Lua
1
2
3
for str in string.gmatch("Med, Ved", '(Med|Ved)') do
  print(str)
end
Подскажите, пожалуйста, как быть. Проверял всё на http://www.lua.org/cgi-bin/demo
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.10.2014, 19:14
Ответы с готовыми решениями:

Lua наследование, lua ооп
Подскажите пожалуйста, как наследовать класс? Не получается выдаёт ошибку local car = {} -- Прежде чем создавать экземпляры объекта,...

Объединение регулярок
Здравствуйте, как эти 2 регулярки можно объединить в одну? В 1 случае номера телефонов на ссылку меняются, во 2 случае электронная почта...

Объяснение регулярок
Объясните, пожалуйста, что каждый символ этих регулярок делает: $s = preg_match("~(?:(?:()\\w]+))$~ius",$arr,$m); $end...

10
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.10.2014, 21:18
Ну так что конкретно ты хочешь вытащить из исходной строки?

Добавлено через 23 минуты
Цитата Сообщение от higimo Посмотреть сообщение
Он, напротив, возвращает только выражение в скобках, хотя находит всё выражение:
Ну правильно возвращает захваты (только без нулевого захвата)

Добавлено через 1 час 38 минут
Цитата Сообщение от higimo Посмотреть сообщение
Тут проблема заключается в том, что почему-то некорректно обрабатывается "|". По идее выражение должно читаться: «Либо это выражение, либо это». Но оно просто выдает, кажется, пустую строку.
Да походу там проблема с этим
Lua's regexp (string.match etc.) will handle many simple cases, but fails on complex "or" situations. For example "You (say|yell) something". For that you need PCRE.

PCRE (which is used in MUSHclient's triggers and aliases) will handle most situations, excepting the (probably rare) situations of nested definitions.

LPeg would be suited to more complex matches, like nested things, or indeed parsing stuff like an XML document.
http://www.gammon.com.au/forum/?id=8683

Добавлено через 24 минуты
PCRE какой-то непонятный погляжу.

Кстати в документации тоже нет "|" http://www.lua.org/pil/20.2.html

Вот думаю может есть что по лучше для регулярок c более похожее на обычные регулярки, иначе возможно стоит просто написать свой модуль на основе C++ к примеру boost/regex
0
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 10
15.10.2014, 16:43  [ТС]
Надо получить:
Code
1
2
3
4
5
6
{
  "Мед1",
  "Мед2 (а1, 2)",
  "Мед3",
  "Мед4"
}
Используя только lua.

Добавлено через 25 секунд
Надо получить:
Code
1
2
3
4
5
6
{
  "Мед1",
  "Мед2 (а1, 2)",
  "Мед3",
  "Мед4"
}
Используя только lua.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.10.2014, 16:51
Из текста что надо вытащить?

К примеру, если то что в кавычках то так можно:
Code
1
2
3
4
5
6
7
8
9
10
local s ="{ \"Мед1\", \"Мед2 (а1, 2)\", \"Мед3\", \"Мед4\" }";
 
i=0;
 
re= "\"(.-)\"";
 
for s1 in string.gmatch(s,re) do
  i=i+1;
  print(i..")",s1);
end
Вывод:
1) Мед1
2) Мед2 (а1, 2)
3) Мед3
4) Мед4
0
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 10
17.10.2014, 18:00  [ТС]
То ли я дурак, то ли лыжи не едут? Вы регулярки мои читали?

Давайте я для вас, раз вы никак не сложите два и два, напишу ещё раз.

input: (string) "Мед1, Мед2 (а1, 2), Мед3, Мед4"

output: (table)
Code
1
2
3
4
5
6
{
  "Мед1",
  "Мед2 (а1, 2)",
  "Мед3",
  "Мед4"
}
На входе программе подается строка, на выходе будет таблица. Примеры предложенных регулярок см. в ОП.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.10.2014, 19:27
del
0
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 10
17.10.2014, 19:35  [ТС]
Перечитайте тему ещё раз, может быть, тогда увидите что откуда нужно доставать. Уже трижды написано. Пожалуйста, не флудите больше, всё таки на вопрос ещё нет ответа. И не вести линию эскалации конфликта, даже удаляя после этого сообщение — оно приходит в оповещении на электропочту, где все видно.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.10.2014, 22:10
Цитата Сообщение от higimo Посмотреть сообщение
Примеры предложенных регулярок см. в ОП.
Первая твоя регулярка изначально не рабочая, вторая не будет работать из-за отсутствия поддержки "|" в lua.
0
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 10
18.10.2014, 01:00  [ТС]
Пожалуйста, прекратите флуд, лучше пусть через месяц появится четкий ответ от человека, что прочитал, чем будет 3 страницы с вашими пререканиями: «тут не ясно», «ты не прав», «тут у тебя не работает». Вы, извините, читать не умеете, а пытаетесь писать какие-то ответы. Я в ОП описал даже в каком месте regexp не работает, а вы спустя n-сообщений только стали проверять это. Пожалуйста, уйдите в другое место, не стоит даже пререкаться на этот пост. Я им хочу вас остановить, чтоб не получать больше бесполезных уведомлений, что вы мне опять не помогли. Не умеете —*уйдите. Не умеете читать — читайте следующий пост. Не всё вы можете, просто уйдите, а я буду ждать, ок?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.10.2014, 00:34
Успехов, разбирайся сам коль так "умен"...

Добавлено через 22 часа 41 минуту
Но я все же выложу решение, возможно кому-то другому пригодится

Code
1
2
3
4
5
6
7
require("rex") -- require "rex_pcre"  _G.rex = rex_pcre
 
input= "Мед1, Мед2 (а1, 2), Мед3, Мед4";
 
for output in rex.gmatch(input,"([А-я\\d]+\\s\\([А-я\\d, ]*\\)|[А-я\\d]+)") do
   print(output);
end;
rex есть в комплекте "LuaForWindows" проверил вроде нормально работает.
0
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
20.10.2014, 16:09
Исключительно регуляркой (имеется ввиду паттерны Lua) здесь не обойтись, по ряду причин. Можно воспользоваться rex'ом, а можно и "чистым" Lua. Не знаю, на сколько эстетично смотрится, но вот:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function ParseMethods (enterString)
    local methods = {};
    local bracketOpen = 0;
    local bracketClose = 0;
    local curClose = bracketClose;
    local stringBeforeBrackets = "";
    while curClose ~= nil do
        bracketOpen = enterString:find("%(", bracketOpen + 1);
        bracketClose = enterString:find("%)", bracketClose + 1);
        stringBeforeBrackets = enterString:sub(curClose + 1, (bracketOpen or (#str + 1)) - 1);
        for substr in stringBeforeBrackets:gmatch("%s*([^,]+)%s*") do
            methods[#methods+1] = substr;
        end
        methods[#methods] = methods[#methods]..(enterString:sub(bracketOpen or 0, bracketClose or 0));
        curClose = bracketClose;
    end
    return methods;
end
На входе строка требуемого вида ("Мед1, Мед2 (а1, 2), Мед3, Мед4"), на выходе нужная таблица.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.10.2014, 16:09
Помогаю со студенческими работами здесь

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

ЧПУ из регулярок
Есть ссылка вида site.ru/news?id=2 Нужно сделать чтобы была такого вида site.ru/news/2/ В правилах я прописал...

Тестер регулярок
Помогите разобраться с тем, что нет так. Не работает следующее: /\n/g не выделяет перевод на новую строку /<b>/g не выделяет:...

Ограничение регулярок
Решил освоить регулярки, не могу найти внятного справочника. Поэтому просто изучаю примеры. Так вот, условие поиска ограничивается некими...

Подскажите на счет регулярок
В общем пытаюсь разобраться, но что-то никак. Вот пример: Regex rgx = new Regex(""); str = rgx.Replace(str, ""); Как...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru