powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Кто на регулярных выражениях собаку съел? Подскажите...
25 сообщений из 85, страница 2 из 4
Кто на регулярных выражениях собаку съел? Подскажите...
    #34934560
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlОшибался :)


Уел Но исходной задачи это увы не решает
Потому что как только мы добавим квантификатор на произвольный символ,
он скушает ZZZ и его не будет. Велеть ему не кушать подстроку мы не умеем,
а все базирующееся на символьных наборах будет частным решением.

Или я не прав ?
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34934980
Tellur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
/AAA([^Z]|Z(?!ZZ))+BBB/
вот же решение
что то я не придумал случая когда оно не сработает
и что значит частное решение? на место AAA BBB и ZZZ можно подставить любые другие строки
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34935014
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tellurна место AAA BBB и ZZZ можно подставить любые другие строки

Угум, а [^Z] в регулярном выражении в RunTime-е будешь строить ???
А если BBB и ZZZ (те самые которые любые строки) одинаковый префикс имеют, как выражение выглядить будет ???

Например:

AAA = qwerty
BBB = abcd
ZZZ = abef

Частным считаю решение, приниципиально зависимое от входных данных
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34936368
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)Но исходной задачи это увы не решает
Потому что как только мы добавим квантификатор на произвольный символ,
он скушает ZZZ и его не будет. Велеть ему не кушать подстроку мы не умеем,
а все базирующееся на символьных наборах будет частным решением.

Или я не прав ?Почти прав. Произвольный символ не скушает ZZZ а сместит его. Любой шаблон содержащий отрицание слова на самом деле означает "и в строке есть подстрока которая не равна ZZZ". Поэтому если у нас есть AAAxZZZ и мы проверяем на (ZZZ){0} подстрока xZ уже удовлетворяет условию, и все выражение становится правдой.
В общем, до тех пор пока у нас в строке нету произвольных символов отрицание будет работать, как только между отрицательным и 'положительным' шаблоном появляется произвольный символ - отрицание работать перестает....
Поэтому обычно задачи типа "проверить что в строке между словами AAA и BBB нету слова ZZZ" решаются через два условия.
Что-то в духе:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#!/usr/bin/perl
$a = "wqeAAAxxZZZxxBBBasdffg";
$b = "wqeAAAxZZxBBBasdffg";
$c = "wqeAAAxxxBBBasdffg";

$pattern1 = "AAA(.*?)BBB";
$pattern2 = "ZZZ";

print "\$a - Yes\n" if (($a =~ $pattern1) && ($ 1  !~ $pattern2));
print "\$b - Yes\n" if (($b =~ $pattern1) && ($ 1  !~ $pattern2));
print "\$c - Yes\n" if (($c =~ $pattern1) && ($ 1  !~ $pattern2));
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34936397
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tellur
Код: plaintext
1.
/AAA([^Z]|Z(?!ZZ))+BBB/
вот же решение
что то я не придумал случая когда оно не сработаета.... это мысль. Запретить первый символ слова или разрешить первый символ после которого не идет конец слова.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#!/usr/bin/perl
$a = "xxxx Ananas xx Apple xx Apricot xxxxx";
$b = "xxxx Ananas xx Almond xx Apricot xxxxx";
$c = "xxxx Ananas Apricot xxxxx";

$pattern = "Ananas([^A]|A(?!pple))*Apricot";

print "\$a - Yes\n" if ($a =~ $pattern);
print "\$b - Yes\n" if ($b =~ $pattern);
print "\$c - Yes\n" if ($c =~ $pattern);
хммм... А ведь работает...
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34936428
Automater
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо подумать над идеей...
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34937068
Tellur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)
Угум, а [^Z] в регулярном выражении в RunTime-е будешь строить ???
А если BBB и ZZZ (те самые которые любые строки) одинаковый префикс имеют, как выражение выглядить будет ???

Например:

AAA = qwerty
BBB = abcd
ZZZ = abef

Частным считаю решение, приниципиально зависимое от входных данных

то же самое можно сказать и про AAA, BBB
их же в током случает тоже "RunTime-е будешм строить"
не вижу нечего сложног сделать [^Z], т.к. Z - это всего лишь первая буква слова ZZZ.
А то так получается надо написать регулярное выражение которое не зная слова AAA должно определить что с него должна начинаться подстрока, должна оканчиваться на некое слово BBB которое тоже в выражении не фигурирует. Фантастика, похоже регулярные выражения научились читать мысли
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34937070
Tellur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)
А если BBB и ZZZ (те самые которые любые строки) одинаковый префикс имеют, как выражение выглядить будет ???

Например:

AAA = qwerty
BBB = abcd
ZZZ = abef


точно так же и будет выглядеть
Код: plaintext
1.
/qwerty([^a]|a(?!bef))+abcd/
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34937071
Tellur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну да, правда вместо "+" стоит "*" поставить
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34937343
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlПоэтому обычно задачи типа "проверить что в строке между словами AAA и BBB нету слова ZZZ" решаются через два условия.
Что-то в духе:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#!/usr/bin/perl
$a = "wqeAAAxxZZZxxBBBasdffg";
$b = "wqeAAAxZZxBBBasdffg";
$c = "wqeAAAxxxBBBasdffg";

$pattern1 = "AAA(.*?)BBB";
$pattern2 = "ZZZ";

print "\$a - Yes\n" if (($a =~ $pattern1) && ($ 1  !~ $pattern2));
print "\$b - Yes\n" if (($b =~ $pattern1) && ($ 1  !~ $pattern2));
print "\$c - Yes\n" if (($c =~ $pattern1) && ($ 1  !~ $pattern2));


Вы только что повторили мою мысль относительно лохматой Бабушки
(см. выше по треду)

Задача не решается в рамках универсального регулярного выражения
Ясный пень, что она легко решается за этими рамками
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34937349
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tellurточно так же и будет выглядеть


Если не сложно, будь так добр написать универсальное Perl-овое регулярное выражение, решающее задачу. Конкретные значения подстрок должны интерполироваться из $1, $2 и $3 соотвественно. Именно выражение, а не скажем кусок кода, генерирующее выражение, решающее частную задачу
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34937419
Tellur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)
Если не сложно, будь так добр написать универсальное Perl-овое регулярное выражение, решающее задачу. Конкретные значения подстрок должны интерполироваться из $1, $2 и $3 соотвественно. Именно выражение, а не скажем кусок кода, генерирующее выражение, решающее частную задачу
Теперь я, кажется, понял о чем речь. Речь о том что Perl умеет подставлять строки в регулярные выражения из "$1, $2 и $3"
К сожалению на Perl не пишу. Пишу на PHP. там в стандарных функциях preg_match() такой возможности нет. preg_match() оперирует одной входной строкой, и на выходе получаем массив совпадений.
Так что вся ваша универсальность работает опять же не везде. не знаю как дело обстоит с C# и .Net
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34937445
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tellur
Так что вся ваша универсальность работает опять же не везде. не знаю как дело обстоит с C# и .Net

Как я уже сказал, все это обсуждалово не более чем игра ума (поскольку есть простой способ решить задачу вне регулярного выражения). Поскольку игра ума хочется чистого решения. Есть чистое решение, подставляющее переменные в выражение (и для PHP кстати). Нет чистого решения, подставляющего результаты обработки этих переменных
Ну и вопросы эффективности. Все эти игры могут существенно просадить производительность, по сравнению с простым и незамысловатым кондовым решением
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34937718
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)Конкретные значения подстрок должны интерполироваться из $1, $2 и $3 соотвественно. Именно выражение, а не скажем кусок кода, генерирующее выражение, решающее частную задачубоюсь, в пыхе (возможно и в перле) выражение "$var" является не строкой, а именно куском кода, генерирующего строку.
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34937721
Tellur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)
Ну и вопросы эффективности. Все эти игры могут существенно просадить производительность, по сравнению с простым и незамысловатым кондовым решением
Согласен. каждой технологии свое место. И использование регулярных выражений здесь не очень то уместно. Но это надо решать на этапе постановки задачи. Я же просто пытался предложить решение в рамках уже поставленой задачи (вопрос был о решении с помощью регулярных выражений)
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34937811
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo Gluk (Kazan)Конкретные значения подстрок должны интерполироваться из $1, $2 и $3 соотвественно. Именно выражение, а не скажем кусок кода, генерирующее выражение, решающее частную задачубоюсь, в пыхе (возможно и в перле) выражение "$var" является не строкой, а именно куском кода, генерирующего строку.

Это вопрос теологический, но при изменении значения переменной регулярное выражение разумеется будет перекомпилировано
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34937880
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты ведь именно теологический вопрос поднял.
А регексп будет компилиться ровно так, как напишешь.
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34937997
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoТы ведь именно теологический вопрос поднял.
А регексп будет компилиться ровно так, как напишешь.

теологический, вопрос поднял автор топика :)
Задача решается проще и эффективнее без помощи регулярных выражений.

Решение White Owl разумеется эффективнее того что предложил я, поскольку поиск на минимальном квантификаторе простой строки (без конструкции выбора) эффективно оптимизируется BM-поиском. Собственно с этого места тему можно считать закрытой, дальше идет теология
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34938018
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tellur
Код: plaintext
1.
/AAA([^Z]|Z(?!ZZ))+BBB/
вот же решение
что то я не придумал случая когда оно не сработает
и что значит частное решение? на место AAA BBB и ZZZ можно подставить любые другие строки

Кстать, не работает ни фига
ни так:

Код: plaintext
1.
2.
3.
4.
5.
$_ = 'CCC AAA DDD BBB ZZZ BBB ZZZ FFF';

if (/AAA([^Z]|Z(?!ZZ))+BBB/) {
   print "$1\n";
}

ни так:

Код: plaintext
1.
2.
3.
4.
5.
$_ = 'CCC AAA DDD BBB ZZZ BBB ZZZ FFF';

if (/AAA([^Z]|Z(?!ZZ))*BBB/) {
   print "$1\n";
}

Почему не работает разбираться было лениво, господа теоретики
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34938027
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вдогон

Gluk (Kazan)Почему не работает разбираться было лениво, господа теоретики

Могу предположить что патамушта DDD

Давайте все же решать поставленные задачи, а не те которые проще решить (оставляя "более общее решение в качестве упражнения для читателя").
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34938032
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пробел выводит
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34938034
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так:

Код: plaintext
1.
2.
3.
4.
5.
$_ = 'CCC AAA DDD BBB ZZZ BBB ZZZ FFF';

if (/AAA([^Z]|Z(?!ZZ))*?BBB/) {
   print "$1\n";
}

тоже не работает
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34938043
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoпробел выводит

А должно DDD ;)
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34938047
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо, правильно пробел выводит, попробуй пробел после ААА стереть
...
Рейтинг: 0 / 0
Кто на регулярных выражениях собаку съел? Подскажите...
    #34938062
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй так
AAA((?:[^Z]|Z(?!ZZ))*)BBB

зы перл – здло и АДЪ следует за ним
...
Рейтинг: 0 / 0
25 сообщений из 85, страница 2 из 4
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Кто на регулярных выражениях собаку съел? Подскажите...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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