регекспы: нулевое совпадение.
Модератор: Модераторы разделов
-
jojahti
- Сообщения: 310
регекспы: нулевое совпадение.
[z]{0} а есть специальный символ имеющий тот-же смысл?
-
/dev/random
- Администратор
- Сообщения: 5489
- ОС: Gentoo
-
jojahti
- Сообщения: 310
Re: регекспы: нулевое совпадение.
/dev/random
Всмысле убрать? 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)) в качестве условия поставив отсутствие конца текста, а когда условий несколько, добавлять их через |. Но помоему отрицательные условия людьми хуже понимаются, чем положительные. И к тому же так почему-то не работает, кстати почему?
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: регекспы: нулевое совпадение.
Похоже, вы не совсем понимаете, что делает этот "[z]{0}". Он просто совпадает в любом месте строки, не поглощая при этом ни одного символа. Т.е. не делает ничего. Вообще. Просто игнорируется.
-
jojahti
- Сообщения: 310
Re: регекспы: нулевое совпадение.
/dev/random
Ну так я его и использую для этого
(совпадение1|совпадение2|[z]{0}(?=текст_перед_которым_никаких_совпадений_быть_не_должно) )
Похоже, вы не совсем понимаете, что делает этот "[z]{0}". Он просто совпадает в любом месте строки, не поглощая при этом ни одного символа. Т.е. не делает ничего. Вообще. Просто игнорируется.
Ну так я его и использую для этого
(совпадение1|совпадение2|[z]{0}(?=текст_перед_которым_никаких_совпадений_быть_не_должно) )
-
/dev/random
- Администратор
- Сообщения: 5489
- ОС: Gentoo
Re: регекспы: нулевое совпадение.
Тогда почему бы его просто не убрать?
(совпадение1|совпадение2|(?=текст_перед_которым_никаких_совпадений_быть_не_должно) )
Ничего не изменится.
-
/dev/random
- Администратор
- Сообщения: 5489
- ОС: Gentoo
Re: регекспы: нулевое совпадение.
Кстати, если я правильно понял, что вы хотите, то ваша команда делает совсем не то, что вы ожидаете. Символ | имеет наименьший приоритет, и код "(?=текст_перед_которым_никаких_совпадений_быть_не_должно)" относится только к третьему варианту, а не ко всем трём.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: регекспы: нулевое совпадение.
жуть какая...
-
jojahti
- Сообщения: 310
Re: регекспы: нулевое совпадение.
/dev/random
o_O Оппа, а как так без явного указания работает? Это же (?=) должно распространяться на предыдущее утверждение.
Тем более оно работает неправильно, второй вариант проглатывать не должно.
puts "abc abc abc"[/\A(abc((?=\z)|[ ]))+\z/]
puts "abc abc abc "[/\A(abc((?=\z)|[ ]))+\z/]
Тогда почему бы его просто не убрать?
o_O Оппа, а как так без явного указания работает? Это же (?=) должно распространяться на предыдущее утверждение.
Тем более оно работает неправильно, второй вариант проглатывать не должно.
puts "abc abc abc"[/\A(abc((?=\z)|[ ]))+\z/]
puts "abc abc abc "[/\A(abc((?=\z)|[ ]))+\z/]
-
/dev/random
- Администратор
- Сообщения: 5489
- ОС: Gentoo
-
jojahti
- Сообщения: 310
Re: регекспы: нулевое совпадение.
А вот так работает как надо:
puts "abc abc abc"[/\A(abc([ ](?!\z)|[z]{0}))+\z/]
puts "abc abc abc"[/\A(abc([ ](?!\z)|[z]{0}))+\z/]
-
/dev/random
- Администратор
- Сообщения: 5489
- ОС: Gentoo
Re: регекспы: нулевое совпадение.
Опять же: уберите [z]{0}, и ничего не изменится.
Upd: Как же я задолбался вам это объяснять... Просто примите как аксиому: если убрать [z]{0} из _любого_ выражения, ничего не изменится. Если работало, продолжит работать, если не работало, то так и не заработает. Если без [z]{0} работает не так, как вам хочется, значит и с [z]{0} работало не так, а вы просто этого не заметили.
-
jojahti
- Сообщения: 310
Re: регекспы: нулевое совпадение.
/dev/random
А, ну да, оно же там не нужно.
Я не пойму как эта штука интерпретируется.
((?=\z)|[ ]))
Я бы прочитал это как: "если не конец строки, то пробел".
но тогда оно не должно с такой штукой совпадать:
puts "abc abc abc "[/\A(abc((?=\z)|[ ]))+\z/]
#=> "abc abc abc "
Опять же: уберите [z]{0}, и ничего не изменится.
А, ну да, оно же там не нужно.
Я не пойму как эта штука интерпретируется.
((?=\z)|[ ]))
Я бы прочитал это как: "если не конец строки, то пробел".
но тогда оно не должно с такой штукой совпадать:
puts "abc abc abc "[/\A(abc((?=\z)|[ ]))+\z/]
#=> "abc abc abc "
-
/dev/random
- Администратор
- Сообщения: 5489
- ОС: Gentoo
-
jojahti
- Сообщения: 310
Re: регекспы: нулевое совпадение.
/dev/random
А почему тут конец строки, но оказывается верным пробел?
puts "abc abc abc "[/\A(abc((?=\z)|[ ]))+\z/]
#=> "abc abc abc "
А почему тут конец строки, но оказывается верным пробел?
puts "abc abc abc "[/\A(abc((?=\z)|[ ]))+\z/]
#=> "abc abc abc "
-
/dev/random
- Администратор
- Сообщения: 5489
- ОС: Gentoo
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: регекспы: нулевое совпадение.
/dev/random писал(а): ↑08.04.2011 11:44Как же я задолбался вам это объяснять... Просто примите как аксиому
это тоже самое, как в программе на С написать
Код: Выделить всё
2 * 2 == 4;