Несколько Слов О Захватах И Регулярных Выражениях, исключительно для разработчиков |
Здравствуйте, гость ( Вход | Регистрация )
Несколько Слов О Захватах И Регулярных Выражениях, исключительно для разработчиков |
7.1.2011, 2:20
Сообщение
#21
|
|
Продвинутый участник Группа: Пользователи Сообщений: 104 Регистрация: 1.4.2009 Из: Россия Пользователь №: 2 871 Спасибо сказали: 42 раза |
Спасибо Вам Илья. Я учусь и набираю опыт с вашей помощью.
Но у меня вопрос. в переменную sDesc записывается [Описание][Тэг]. Я хотел бы разделить их на две разные переменные. Это возможно? |
|
|
7.1.2011, 12:21
Сообщение
#22
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Код local sDescription, sTag = sDesc:match'^(.*)(<.*>)$'
if not sDescription then sDescription = sDesc sTag = '' end |
|
|
9.1.2011, 3:12
Сообщение
#23
|
|
Продвинутый участник Группа: Пользователи Сообщений: 153 Регистрация: 21.9.2008 Из: Челябинск Пользователь №: 574 Спасибо сказали: 54 раза |
ещё бы описание того что делают в регулярных выражениях квадратные скобки...
Насколько я понимаю в них указываются варианты символов, которые могут быть в этом месте строки, а как быть если эти варианты состоят не из одного символа? Аналогично и для "всяких плюсиков" т.е. возможно ли использовать их относительно группы символов и если да, то как её обозначить? |
|
|
9.1.2011, 13:58
Сообщение
#24
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Квадратные скобки обозначают так называемые символьные класса. Это означает, что на данном месте может стоять любой из символом, который указан в символьном классе.
В символьном классе возможно задать диапазоны символов: [А-Яа-я]. Так выглядит диапазон всех русских букв за исключением Ё и ё. Что касается плюсика, то к символьному классу можно его применять. Код local s="baaabbbababbbaaaaab bababbbababbabbabbab"
print(s:match"([ab]+)") -- Результат: baaabbbababbbaaaaab |
|
|
9.1.2011, 15:45
Сообщение
#25
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
а как быть если эти варианты состоят не из одного символа? В луа, к сожалению, в регулярках подобного нету, так что приходится делать несколько выражений. |
|
|
9.1.2011, 16:41
Сообщение
#26
|
|
Белый Волк Группа: Пользователи Сообщений: 1 723 Регистрация: 11.9.2008 Из: г.Томск Пользователь №: 516 Спасибо сказали: 657 раз |
Цитата а как быть если эти варианты состоят не из одного символа? Serx, пример приведи..
|
|
|
9.1.2011, 17:48
Сообщение
#27
|
|
Продвинутый участник Группа: Пользователи Сообщений: 153 Регистрация: 21.9.2008 Из: Челябинск Пользователь №: 574 Спасибо сказали: 54 раза |
Nickolya уже ответил, то что я и думал (как бы мне этого и не хотелось)
Ksan: я просто сейчас составляю выражения для антимата (не захотел брать готовый "набор выражений", чтобы самому получше разобраться) и вот сейчас чтобы без мата пишу пример который первый пришел в голову: допустим хочется перехватить "ложку" и "ложечку" не затрагивая слова "ложе" у меня были мысли чтобы записать выражение вроде Код ло[(ж)(жеч)]ка как я понял такое в LUA одним выражением не осуществить) |
|
|
9.1.2011, 18:00
Сообщение
#28
|
|
Белый Волк Группа: Пользователи Сообщений: 1 723 Регистрация: 11.9.2008 Из: г.Томск Пользователь №: 516 Спасибо сказали: 657 раз |
1. Может, поможет это:
Код "лож[е]?[ч]?ка" Вряд ли напишут "ложчка" или "ложека" Ну я проверил, работает (а как же иначе?) Вот результат в чате: Цитата [21:06:07] ложка [21:06:12] ложечка [21:06:15] <Test> ложе 2. Ну либо "ложе" вводи в исключения. А насчёт "ложчка" - лично у себя я опечатки и орфографические ошибки не ввожу в исключения, пусть учатся грамотно писать. |
|
|
9.1.2011, 18:11
Сообщение
#29
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Дело в том, что в регулярке lua, в отличие от перловской регулярки, нету знака "или", который обозначается в перле пайпом - "|".
Что касается указанного примера: Код "лож[е]?[ч]?ка" то тут можно обойтись и без символьных классов:Код "ложе?ч?ка"
|
|
|
9.1.2011, 18:16
Сообщение
#30
|
|
Белый Волк Группа: Пользователи Сообщений: 1 723 Регистрация: 11.9.2008 Из: г.Томск Пользователь №: 516 Спасибо сказали: 657 раз |
Не подумал.
Но по большому счёту там могли быть и 2 и больше символов, просто это пример такой простой. |
|
|
8.12.2011, 1:03
Сообщение
#31
|
|
KEEP CLEAR AT ALL TIMES Группа: Пользователи Сообщений: 141 Регистрация: 4.9.2011 Из: Беларусь, Минск Пользователь №: 9 667 Спасибо сказали: 3 раза |
Подскажите, пожалуйста, как организовать захват всего
Код ..:match("<pubDate>(.-)</pubDate>") При таком шаблоне у меня, естественно, только одно совпадение и, соответственно, один захват. Что надо дописать в шаблон, чтобы происходил захват всех таких совпадений? Логика подсказывает, что нужен плюс "+", только вот куда его вставить? |
|
|
8.12.2011, 2:51
Сообщение
#32
|
|
Белый Волк Группа: Пользователи Сообщений: 1 723 Регистрация: 11.9.2008 Из: г.Томск Пользователь №: 516 Спасибо сказали: 657 раз |
Попробуй внедрить в свой скрипт эту процедуру (названия переменных можешь изменить как тебе понравится):
Код t = {} for k, v in sMsg:gmatch("<pubDate>.-</pubDate>") do local s = v:match("<pubDate>(.-)</pubDate>") t[k] = s end При выполнении все строки, содержащее нужную тебе информацию (в данном случае время/дату) сохранятся в таблицу t Потом сможешь вытаскивать их когда и как тебе угодно, например, так: Код local sTime = t[1] дальше это вставляешь в своё выводимое сообщение в нужное место. |
|
|
8.12.2011, 2:54
Сообщение
#33
|
|
7 квадратиков Группа: Модераторы Сообщений: 793 Регистрация: 21.1.2009 Пользователь №: 1 895 Спасибо сказали: 301 раз |
Используй конструкцию типа:
Код for v in sData:gmatch"<pubDate>(.*)</pubDate>" do ... end Внутри этого цикла переменной v будет поочерёдно присвоено значение из всех захватов по маске. PS: Страницу с погодой я не смотрел и потому правильность маски не гарантирую. PPS: Ну Ksan!!! Опередил... :P Сообщение отредактировал Alexey - 8.12.2011, 3:03 |
|
|
23.1.2012, 10:01
Сообщение
#34
|
|
Абсолютный новичок Группа: Пользователи Сообщений: 1 Регистрация: 23.1.2012 Пользователь №: 10 211 Спасибо сказали: 0 раз |
Здавствуйте) Подскажите а какой символ в регулярных выражения lua используется для отступов(табуляции)??? в каждой строке есть несколько отступов, нужно найти содержимое между ними, ниче не могу придумать(((
|
|
|
23.1.2012, 11:50
Сообщение
#35
|
|
Наруто на аваторке Группа: Пользователи Сообщений: 2 606 Регистрация: 11.10.2008 Из: Харькова Пользователь №: 771 Спасибо сказали: 774 раза |
Xomut
Код %s - \t \n \v \f \r <space>
|
|
|
23.1.2012, 16:42
Сообщение
#36
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
можно заюзать "\t+(%S*)"
|
|
|
4.3.2012, 2:08
Сообщение
#37
|
|
KEEP CLEAR AT ALL TIMES Группа: Пользователи Сообщений: 141 Регистрация: 4.9.2011 Из: Беларусь, Минск Пользователь №: 9 667 Спасибо сказали: 3 раза |
Захват с начала строки понятен. Но как организовать захват с конца строки до ближайшего символа "/" влево в случае, если строка по длине непостоянна и количество директорий может меняться. Например, захватить имя файла (может меняться) с расширением (может меняться) – "sFileName.sExt":
Код http://sHostName/sDir1/sDir2/.../sDirN/sFileName.sExt
|
|
|
4.3.2012, 2:22
Сообщение
#38
|
|
Освоившийся участник Группа: Пользователи Сообщений: 391 Регистрация: 4.11.2009 Из: Дом Пользователь №: 4 923 Спасибо сказали: 239 раз |
"[^/]+$"
|
|
|
4.3.2012, 2:57
Сообщение
#39
|
|
KEEP CLEAR AT ALL TIMES Группа: Пользователи Сообщений: 141 Регистрация: 4.9.2011 Из: Беларусь, Минск Пользователь №: 9 667 Спасибо сказали: 3 раза |
Поиск/захват строки всегда идёт только слева направо, т.е. с начала строки и до конца, или есть вариант наоборот – справа налево, т.е. с конца строки и до начала без каких-либо лишних сортировок?
|
|
|
4.3.2012, 3:01
Сообщение
#40
|
|
Освоившийся участник Группа: Пользователи Сообщений: 391 Регистрация: 4.11.2009 Из: Дом Пользователь №: 4 923 Спасибо сказали: 239 раз |
Слева направо. Но тебе никто не мешает сделать реверс строки (string.reverse), а потом гонять регулярки. К найденным кусками потом снова применить реверс и будет поиск справа налево.
|
|
|
Похожие темы
|
Сейчас: 23.11.2024, 2:43 |