ПоискПочтаКалендарьДеньгиМой КругФоткиНародОткрытки
Войти


Чтобы получить доступ ко всем возможностям Я.ру, создайте страницу или , если у вас она уже есть.
userpic

премодерируемый клуб  

Присоединившись к клубу, вы сможете вывешивать фотки в галерее и создавать новые темы для обсуждения. Обсуждаемые темы клуба будут появляться на странице «Что нового».
Вступить в клуб
Курсы по регэкспам
О клубе
21 апреля 2009 года, 16:53
О клубе

Здесь обсуждают регулярные выражения (regular expressions) — удобный и компактный способ описания формальных языков; а на практике — мощное средство для работы с текстами.

Если вы хотите получить помощь в разработке regexp’а, поделиться красивым выражением или задачкой — добро пожаловать!

В клубе действуют правила.
Правила клуба

$defaultrules =~ s/^.*Материться.*\​n//m;

записи по месяцам · меткам · типам

выделить все / снять выделение

Показать
deniszh написал
8 января, 19:55
userpic
inequ regex

Приветствую всех!

Бродил я тут по инету и наткнулся на интересную вещь. Все тут присутствующие (многие, по крайней мере) знают про квайны (quines) - программы, которые выводят свой исходный код. В какой то мере это можно считать зачатками искусственной жизни - оно (примитивно конечно, но) может самовоиспроизводиться. Оказывается можно пойди дальше по этому пути - жизнь не только размножается, но и обладает органами чувств. То есть, оказывается есть еще малоизвестный класс программ - inequ, которые умеют распознавать свой собственный код. То есть если этой программе подать на вход свой собственный исходник, она подтвердит - "да, это так", если нет - скажет что "нет" (через exit code например). 

Но это все вступление. А вопрос будет такой - можно ли написать регулярное выражение которое совпадает с собой и только с собой (ну или как вариант - с минимальным количеством строк, кроме себя). Скажем, первый пришедший в голову вариант - a, естественно совпадает сам с собой, но также совпадает с "aa", "aaa", "apple" и т.д. - с бесконечным количеством строк в общем. В сети же нашел вариант с минимумом совпадений равным 549 миллиардам с хвостиком - что мягко говоря дофига...

Есть желающие поломать голову ?

(чур не гуглить :):) )

ifman написал
21 июля 2011 года, 11:40
userpic
Задача на четность вхождений + вопрос про два плюса
Есть строка, содержащая символы a, b, /.
Надо проверить чтобы перед символом b стояли либо a (любое количество), либо 0 или четное количество слэшей. То есть, нечетное количество слэшей может быть только перед a, либо в конце строки.

Есть решения, но два из них, говорят, неверные. А одно верное, но странное.
( читать дальше )

(?:b|a|^)(?:\/\/)*\/b



(?<!/)(?:/{2})*(b)



^(?:[^/]++|(?:/)++[^b]|(?://)*+(?:b) )*$


Вопрос: почему два первых решения неверны (это не факт. По слухам.) и что за конструкции "++" и "*+" в третьем? Не нашел упоминаний таких конструкций в интернете.

Я исправил третье выражение так:

{^ (?: [ab]+ | (?:/)+a | (?://)*b)* $}x


Оно работает, но почему-то спотыкается на "///b". А вот если добавить еще один плюс:


{^ (?: [ab]+ | (?:/)++a | (?://)*b)* $}x


работает. Почему?

Если что - родное обсуждение тут.
علي (Али) написал
изменено 4 января, в 15:17
userpic
Всё или ничего

Бывают такие ситуации, что синтаксис требует регулярки, а она, строго говоря, не нужна.


Пример на поверхности: rewrite в директивах апача или нжиникса, который должен обрабатывать все запросы. Тогда регулярное выражение должно матчить все (любые) строки. Решение в лоб:


.*


Или так:


.?


Или, если вспомнить про якоря, то вот, самое лаконичное:


^


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


( Дальше… )

Тут я сразу пошел по сложному пути, почему-то мне показалось, что без look-around или магии с \K не обойтись, и навертел несколько монстроидальных выражений. Перекурив, опять вспомнил про якоря и сделал так:


x^


Очень даже работает. Первый символ замените по вкусу на что угодно. Хохмы ради написал еще


$^


но тут облом, оно совпадает на концах строк в режиме multi-line (а предыдущее, кстати, не совпадает, даже при наличии настоящего «x» в конце строки).


Что-то мне подсказывает, что обойтись только классическими выражениями из теории формальных языков нельзя. То есть одних только последовательности, дизъюнкции и звезды Клини (ну, для облегчения жизни можно добавить еще символьные классы и точку) недостаточно, чтобы построить выражение, не совпадающее ни с одной строкой над заданным алфавитом.


Чую, но обосновать не могу. То есть доказать или опровергнуть. Может, кто возьмется?


gtv написал
7 апреля 2011 года, 19:46
userpic
Готовые решения по зачистке HTML кода.

Это вопрос)) - есть ли таковые? Которые чистили бы строки от всех тегов и их атрибутов (желательно включая "мусор" из Word-a), кроме нужных (НП: <img align... src...>, <p>, </p>, <br>...  и другие заданные). Полезная же тема - должно быть что-то =\

gtv написал
11 марта 2011 года, 18:11
userpic
Исправление расположения файлов

Наверняка многим пригодится:

Есть "Текст, текст, текст, <img src="http://host.ru/imgs/subfolder1/4/0.png" align="right"/>, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, <img src="http://host.ru/imgs/subfolder1/4/1.bmp" align="left"/> текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст <img src="http://host.ru/imgs/subfolder2/1/0.gif"/>, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, тек<img src="http://host.ru/imgs/subfolder83/14/10.jgg" align="right"/>ст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст, текст"

Необходимо заменить в нём (тексте) содержимое src="" для изображений так чтобы осталось лишь название файлов.

Я лишь начинаю въезжать в регулярные выражения и пока не могу решить эту задачу, но представляю это так:

1. Ищем в строке ($Строка) подтрокИ начинающиеся с src=" и оканчивающиеся двойной кавычкой.

2. Удаляем всё начиная с последней косой черты (/) к началу не задевая src=".

Ход мысли правильный?))

1. ereg('^src="|"$'); - чушь?

2. Даже не представляю что изобразить, ПОМОГИТЕ

Мартин Мизантроп написал
16 января 2011 года, 19:36
userpic
Дублирование возврата каретки...

как победить?

грубо гря имеем: 

 

123CR
CRLF
123CRLF
123CR
CRLF

 

Каким образом убрать это дурацкое дублирование CR?

CR = возврат каретки;

LF = подача строки;

 

( зачем? )собсно напрягает видеть в notepad++ пустые строки из-за его интерпретации этого дубля возврата каретки
 

 

( SOLVED (thx to Ali) )binmode решил проблему)
 

 

علي (Али) написал
15 октября 2010 года, 18:21
userpic
Эй-би-си, блин

Задача, значит, такая: требуется проверить, что строка состоит только из символов a, b и c — символы могут встретиться в произвольном порядке, произвольное количество раз, но не менее одного раза каждый.


Требование это можно выразить так:


$x =~ /a/ && $x =~ /b/ && $x =~ /c/ && $x !~ /[^abc]/


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


/^[abc]*(((b[abc]*c|c[abc]*b)[abc]*a)|((a[abc]*c|c[abc]*a)[abc]*b)|((a[abc]*b|b[abc]*a)[abc]*c))[abc]*$/


Для трех символов уже достаточно монструозно, а для десяти писать 10! = 3628800 подвыражений совсем не хочется.


Подозреваю, что я тупой и проглядел что-то очевидное.


Голосом Ивана Данко:
 — Какьие будут вашьи предложьенийа?


UPD: сильно надо, чтобы регулярка была в синтаксисе POSIX, без перловых расширений.


Сильвестр с талоном написал
8 апреля 2010 года, 12:51
userpic
ВсЕм чМаВкИ!

Я сильно сомневаюсь, что тут есть блондинки, но вдруг кому-то пригодится... :))) Презентуемая регулярка преобразует "Всем чмавки!" во "ВсЕм чМаВкИ!".


Регулярка: 

s/(.)(.?)/\u$1\l$2/g


На Perl это выглядит так:

use strict;
use warnings;
use utf8;

my $text = 'Всем чмавки!';

utf8::decode( $text );
$text =~ s/(.)(.?)/\u$1\l$2/g;
utf8::encode( $text );

print( $text );


Вот такие сиськи пироги... :)


ЗЫ: А вот так можно сделать, чтобы каждое слово начиналось с большой буквы:

 

s/(\w)(.?)/\u$1\l$2/gi


ВсЕм ЧмАвКи!!! В ЭтОм ЧаТиКе! =D

علي (Али) поделился ссылкой
19 марта 2010 года, 02:10
userpic
re2

Вышла реализация DFA-регэкспов для C++ от Гугла.



Скорость поиска /.*$/ в случайном тексте.


Очень, очень полезно. Большинство регэкспов не требуют всех возможностей NFA, а выигрыш в скорости налицо.

علي (Али) написал
13 февраля 2010 года, 12:57
userpic
The Russians are coming

Яну Гойвертсу прислали авторский экземпляр книги «Регулярные выражения. Сборник рецептов». Ян, натурально, по-русски не читает, и смог заметить только, что


Судя по нумерации оглавления, книга переведена полностью.

Это я к чему — если кто ещё не знает о блоге Яна Гойвертса, автора RegexBuddy, PowerGREP и соавтора упомянутой книги, то самое время узнать: www.regexguru.com.

 

Что получается:    изменить 
Подписаться на комментарии к записи

Получать уведомления о всех ответах в этом обсуждении.

 
Отписаться от комментарев к записи

Получать уведомления только о тех ответах в этом обсуждении, которые адресованы лично вам.

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