регекспы: нулевое совпадение.

Модератор: Модераторы разделов

Аватара пользователя
jojahti
Сообщения: 310

регекспы: нулевое совпадение.

Сообщение jojahti »

[z]{0} а есть специальный символ имеющий тот-же смысл?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5489
ОС: Gentoo

Re: регекспы: нулевое совпадение.

Сообщение /dev/random »

jojahti писал(а):
07.04.2011 17:24
[z]{0} а есть специальный символ имеющий тот-же смысл?

o_O
Такого символа нет. Просто _отсутствие_ каких-либо символов будет означать именно это. Т.е. этот ваш [z]{0} должно быть достаточно просто вырезать.
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: регекспы: нулевое совпадение.

Сообщение jojahti »

/dev/random
o_O
Такого символа нет. Просто _отсутствие_ каких-либо символов будет означать именно это. Т.е. этот ваш [z]{0} должно быть достаточно просто вырезать.

Всмысле убрать? o_O
Вот у меня упрощённый вариант регекпсика, который проверяет текст на корректность, сопоставляя его с шаблоном корректного текста.

word="[a-zA-Z]+"
splittext="([ ]|(\\n[ ])|(([z]{0})(?=\\z)))"
sentence="("+word+"[ ]?)+[.]"
text="("+sentence+splittext+")+"

puts Regexp.new(text).match "Some korrect text.\n This simply. For test regexp."


Текст определён как последовательность предложений(sentence) и разделителей(splittext). Причём разделитель, не должен быть в конце последовательности. Потому у меня в разделителе просто условие стоит, говорящее, когда он должен иметь нулевую длину
(([z]{0})(?=\\z))

Можно конечно убрать условие нафиг и поставить после splittext вопросик. Но тогда будут сопоставляться с шаблоном склеенные предложения, чего делаться не должно.

word="[a-zA-Z]+"
splittext="([ ]|((\\n)[ ]))"
sentence="("+word+"[ ]?)+[.]"
text="("+sentence+splittext+"?)+"

puts Regexp.new(text).match "Some korrect text.\n This simply.For test regexp."


Ещё можно конечно избавиться от ([z]{0}), если сделать негативную опережающую проверку (([ ]|(\\n[ ]))(?!\\z)) в качестве условия поставив отсутствие конца текста, а когда условий несколько, добавлять их через |. Но помоему отрицательные условия людьми хуже понимаются, чем положительные. И к тому же так почему-то не работает, кстати почему?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5489
ОС: Gentoo

Re: регекспы: нулевое совпадение.

Сообщение /dev/random »

Похоже, вы не совсем понимаете, что делает этот "[z]{0}". Он просто совпадает в любом месте строки, не поглощая при этом ни одного символа. Т.е. не делает ничего. Вообще. Просто игнорируется.
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: регекспы: нулевое совпадение.

Сообщение jojahti »

/dev/random
Похоже, вы не совсем понимаете, что делает этот "[z]{0}". Он просто совпадает в любом месте строки, не поглощая при этом ни одного символа. Т.е. не делает ничего. Вообще. Просто игнорируется.

Ну так я его и использую для этого
(совпадение1|совпадение2|[z]{0}(?=текст_перед_которым_никаких_совпадений_быть_не_должно) )
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5489
ОС: Gentoo

Re: регекспы: нулевое совпадение.

Сообщение /dev/random »

jojahti писал(а):
08.04.2011 10:59
Ну так я его и использую для этого
(совпадение1|совпадение2|[z]{0}(?=текст_перед_которым_никаких_совпадений_быть_не_должно) )

Тогда почему бы его просто не убрать?
(совпадение1|совпадение2|(?=текст_перед_которым_никаких_совпадений_быть_не_должно) )
Ничего не изменится.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5489
ОС: Gentoo

Re: регекспы: нулевое совпадение.

Сообщение /dev/random »

jojahti писал(а):
08.04.2011 10:59
Ну так я его и использую для этого
(совпадение1|совпадение2|[z]{0}(?=текст_перед_которым_никаких_совпадений_быть_не_должно) )

Кстати, если я правильно понял, что вы хотите, то ваша команда делает совсем не то, что вы ожидаете. Символ | имеет наименьший приоритет, и код "(?=текст_перед_которым_никаких_совпадений_быть_не_должно)" относится только к третьему варианту, а не ко всем трём.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: регекспы: нулевое совпадение.

Сообщение drBatty »

jojahti писал(а):
08.04.2011 10:59
Ну так я его и использую для этого
(совпадение1|совпадение2|[z]{0}(?=текст_перед_которым_никаких_совпадений_быть_не_должно) )

жуть какая...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: регекспы: нулевое совпадение.

Сообщение jojahti »

/dev/random
Тогда почему бы его просто не убрать?

o_O Оппа, а как так без явного указания работает? Это же (?=) должно распространяться на предыдущее утверждение.

Тем более оно работает неправильно, второй вариант проглатывать не должно.
puts "abc abc abc"[/\A(abc((?=\z)|[ ]))+\z/]
puts "abc abc abc "[/\A(abc((?=\z)|[ ]))+\z/]
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5489
ОС: Gentoo

Re: регекспы: нулевое совпадение.

Сообщение /dev/random »

jojahti писал(а):
08.04.2011 11:37
o_O Оппа, а как так без явного указания работает? Это же (?=) должно распространяться на предыдущее утверждение.

В вашем случае оно тоже не распространяется, см. сообщение #7.
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: регекспы: нулевое совпадение.

Сообщение jojahti »

А вот так работает как надо:
puts "abc abc abc"[/\A(abc([ ](?!\z)|[z]{0}))+\z/]
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5489
ОС: Gentoo

Re: регекспы: нулевое совпадение.

Сообщение /dev/random »

jojahti писал(а):
08.04.2011 11:41
А вот так работает как надо:
puts "abc abc abc"[/\A(abc([ ](?!\z)|[z]{0}))+\z/]

Опять же: уберите [z]{0}, и ничего не изменится.


Upd: Как же я задолбался вам это объяснять... Просто примите как аксиому: если убрать [z]{0} из _любого_ выражения, ничего не изменится. Если работало, продолжит работать, если не работало, то так и не заработает. Если без [z]{0} работает не так, как вам хочется, значит и с [z]{0} работало не так, а вы просто этого не заметили.
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: регекспы: нулевое совпадение.

Сообщение jojahti »

/dev/random
Опять же: уберите [z]{0}, и ничего не изменится.

А, ну да, оно же там не нужно.

Я не пойму как эта штука интерпретируется.
((?=\z)|[ ]))

Я бы прочитал это как: "если не конец строки, то пробел".

но тогда оно не должно с такой штукой совпадать:
puts "abc abc abc "[/\A(abc((?=\z)|[ ]))+\z/]
#=> "abc abc abc "
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5489
ОС: Gentoo

Re: регекспы: нулевое совпадение.

Сообщение /dev/random »

jojahti писал(а):
08.04.2011 11:53
Я бы прочитал это как: "если не конец строки, то пробел".

В общем, да. "Конец строки или пробел".
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: регекспы: нулевое совпадение.

Сообщение jojahti »

/dev/random
А почему тут конец строки, но оказывается верным пробел?
puts "abc abc abc "[/\A(abc((?=\z)|[ ]))+\z/]
#=> "abc abc abc "
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5489
ОС: Gentoo

Re: регекспы: нулевое совпадение.

Сообщение /dev/random »

jojahti писал(а):
08.04.2011 12:04
А почему тут конец строки, но оказывается верным пробел?
puts "abc abc abc "[/\A(abc((?=\z)|[ ]))+\z/]
#=> "abc abc abc "

Потому что это ещё не конец строки. Конец строки идёт _после_ пробела.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: регекспы: нулевое совпадение.

Сообщение drBatty »

/dev/random писал(а):
08.04.2011 11:44
Как же я задолбался вам это объяснять... Просто примите как аксиому

это тоже самое, как в программе на С написать

Код: Выделить всё

2 * 2 == 4;

http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: