Регулярные выражения — ликбез по регэкспам

Здесь обсуждаются темы, косвенно связанные с Far.
Demiurg
Posts: 22
Joined: Wed 05 May, 2010 07:39
Location: Химки
Contact:

Re: Помогите с регулярным выражением.

Post by Demiurg »

Latest post of the previous page:

Perl

Code: Select all

my @a = ( '1.0 alpha 1', '2.0.0rc2', '1.0.0a', '1.0.0.5' );

for( @a ) {
    my @b = split /\W|(?<=\d)(?=\D)/;
    print join(', ', @b) . "\n";
}
Результат:

Code: Select all

1, 0, alpha, 1
2, 0, 0, rc2
1, 0, 0, a
1, 0, 0, 5
User avatar
WARP ItSelf
Самый умный
Posts: 1011
Joined: Tue 15 Mar, 2005 23:19
Contact:

Re: Помогите с регулярным выражением.

Post by WARP ItSelf »

Еще вопрос возник на ту же тему. Чуть более хитрый.

Нужно регулярное выражение, рекурсивное, которое будет доставать все подстроки, начинающиеся с подстроки А и заканчивающиеся на подстроку Б.

Т.е для строки: {{this is a test {{nested}} string}} хочется получить

1. this is a test {{nested}} string
2. nested

Строки А и Б, соответственно это {{ и }}
Никто не знал, а я...
User avatar
HaRT
Moderator
Posts: 10823
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Re: Помогите с регулярным выражением.

Post by HaRT »

В данном контексте понятия “регулярный” и “рекурсивный” почти взаимоисключающие. “Почти” — потому, что регулярный язык в принципе может иметь рекурсию, но только не более наперёд заданной глубины. Насколько я знаю, регулярными выражениями рекурсия не описывается. Впрочем, пойду-ка посмотрю недавние добавления в PCRE…
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
Centaur
Posts: 1083
Joined: Tue 05 Apr, 2005 20:09
Location: Novosibirsk, Russia
Been thanked: 2 times

Re: Помогите с регулярным выражением.

Post by Centaur »

+1 к теоретической невозможности распарсить контекстно-свободную грамматику регулярным выражением. Единственное расширение регулярных выражений — это бэкреференсы, а они тут не помогут.
Kildor
Posts: 1515
Joined: Wed 16 Mar, 2005 06:26
Location: Новосибирск
Been thanked: 1 time
Contact:

Не получается сделать регэксп с «*»

Post by Kildor »

f2065 wrote: А где вообще почитать какой-нибудь хороший FAQ или мануал по встроенным регэкспам FAR ?
Во встроенной F1-справке как-то это все неочевидно…
В фаре используется +/- PCRE диалект регулярок. За исключением отсутствия поддержки многострочности (ограничение собственно редактора), и части новых вещей стандарта. Поэтому всё просто.

PS: По поводу многострочного поиска — можно обойти это ограничение путём поиска-замены из панелей, например плагином S&R (ReSearch тоже же это умеет?).
Ты мне не выкай!
«ФарФорум не для пользователей!»
Upd:
P.S. Я просто поддерживаю беседу.» © Народ.

xmpp:kildor@jabber.ru
2useven10
Posts: 5209
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

Re: Не получается сделать регэксп с «*»

Post by 2useven10 »

ladserg
Posts: 234
Joined: Thu 19 Feb, 2009 14:51
Has thanked: 5 times
Been thanked: 6 times

Применение регулярных выражений

Post by ladserg »

Чот не могу понять, то ли я неправильный шаблон поиска задаю, то ли еще что. Есть файл со строками вида:
Ищу все строки в которых нет DLL файлов, шаблон "(^.*)(?!dll$)$" выделяет все строки, зато шаблон "(^.*)(?:dll$)$" как раз выделяет только строки с DLL файлами, кои мне надо пропустить. Никто не подскажет, чего я делаю не так?

Проверялось на всех трёх библиотеках.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: LuaFAR Search

Post by Shmuel »

ladserg wrote:Чот не могу понять, то ли я неправильный шаблон поиска задаю, то ли еще что. Есть файл со строками вида:
Ищу все строки в которых нет DLL файлов, шаблон "(^.*)(?!dll$)$" выделяет все строки, зато шаблон "(^.*)(?:dll$)$" как раз выделяет только строки с DLL файлами, кои мне надо пропустить. Никто не подскажет, чего я делаю не так?

Проверялось на всех трёх библиотеках.
Вот так работает: .*?(?!\.dll$).{4}$|^.{1,3}$
ladserg
Posts: 234
Joined: Thu 19 Feb, 2009 14:51
Has thanked: 5 times
Been thanked: 6 times

Re: LuaFAR Search

Post by ladserg »

Shmuel wrote:Вот так работает: .*?(?!\.dll$).{4}$|^.{1,3}$
Спасибо, скажите мой вариант был ошибочен?
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: LuaFAR Search

Post by Shmuel »

Ваши варианты дали результаты, соответствующие им, то-есть плагин выдал то, что ему сказали выдать.
ladserg
Posts: 234
Joined: Thu 19 Feb, 2009 14:51
Has thanked: 5 times
Been thanked: 6 times

Re: LuaFAR Search

Post by ladserg »

Всё кажется разобрался, я правильно понял что паттерн вида (?!pattern) выступает как один символ и надо указывать его размер?

Вот так: ^.*(?!\.dll$).{4}$ тоже работает, а для чего дополнение |^.{1,3}?
Shmuel wrote:Ваши варианты дали результаты, соответствующие им, то-есть плагин выдал то, что ему сказали выдать.
Видимо я пока еще не совсем понял эту часть регэкспов :-/
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: LuaFAR Search

Post by Shmuel »

ladserg wrote:Всё кажется разобрался, я правильно понял что паттерн вида (?!pattern) выступает как один символ и надо указывать его размер?

Вот так: ^.*(?!\.dll$).{4}$ тоже работает, а для чего дополнение |^.{1,3}?
1. Неправильно.
2. Для имён короче 4 символов.
ladserg
Posts: 234
Joined: Thu 19 Feb, 2009 14:51
Has thanked: 5 times
Been thanked: 6 times

Re: LuaFAR Search

Post by ladserg »

Shmuel wrote:1. Неправильно.
Хм, понял, пойду курить маны.
Shmuel wrote:2. Для имён короче 4 символов.
Странно, без него все равно работает как надо :-/

Спасибо.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: LuaFAR Search

Post by Shmuel »

ladserg wrote:
Shmuel wrote:2. Для имён короче 4 символов.
Странно, без него все равно работает как надо :-/
Попробуйте добавить в файл строчку abc - она не будет выведена без |^.{1,3}$ в паттерне.
ladserg
Posts: 234
Joined: Thu 19 Feb, 2009 14:51
Has thanked: 5 times
Been thanked: 6 times

Re: LuaFAR Search

Post by ladserg »

Shmuel wrote:Попробуйте добавить в файл строчку abc - она не будет выведена без |^.{1,3}$ в паттерне.
Понял, спасибо.
ladserg
Posts: 234
Joined: Thu 19 Feb, 2009 14:51
Has thanked: 5 times
Been thanked: 6 times

Re: LuaFAR Search

Post by ladserg »

Shmuel wrote:Попробуйте добавить в файл строчку abc - она не будет выведена без |^.{1,3}$ в паттерне.
Кажется я разобрался в чем была моя ошибка. Предлагаю чуток изменить справку по поводу вот таких конструкций на текст вида:
(?= шаблон) - после этой точки есть фрагмент текста, который соответствует указанному регулярному выражению,
(?! шаблон) - после этой точки нет текста, который бы соответствовал указанному регулярному выражению,
(?<= шаблон) - перед этой точкой есть фрагмент текста, соответствующий указанному регулярному выражению,
(?<! шаблон) - перед этой точкой нет фрагмента текста, соответствующего указанному регулярному выражению.
Он, признаться, понятнее чем нынешний текст.

Теперь получается паттерн можно упростить: ^(?!.*\.dll$).*$ , вроде работает, если я правильно понял приведенную мною цитату :-/ .
Post Reply

Return to “Операционные системы, командные оболочки и прочее”