Странный результат регулярки

Nick

Client
Регистрация
22.07.2014
Сообщения
1 980
Благодарностей
815
Баллы
113
в конструкторе регулярок анализирую текст:
В поле «Это идёт после искомого текста» ставлю кавычку - вот такую: "
Нажимаю «Тест», получаю два элемента в результирующем списке.

Почему не один?

И отдельный вопрос: почему первый элемент обозначен числом ноль? Не говорите мне, что у программистов нумерация начинается с нуля — это неправда. С нуля начинают смещение относительно первого элемента, а тут смещение вообще ни при чём.
 

wizard

Client
Регистрация
04.10.2011
Сообщения
991
Благодарностей
608
Баллы
93
по тому что у Вас получается регулярка .*(?=") , а . это любой символ (почти) , а * это 0 или более раз
вот в первом случае он находит цифры до знака "
а во втором НИЧЕГО до знака " (потому что цифры он уже находил )

Не говорите мне, что у программистов нумерация начинается с нуля — это неправда
во многих языках программирования исчисление начинается от 0 (например в js даже месяцы от 0 до 11, то-есть декабрь №11)
 

Nick

Client
Регистрация
22.07.2014
Сообщения
1 980
Благодарностей
815
Баллы
113
спасибо за объяснение :-) в обоих случаях получается не то, что пользователь ожидает, прошу считать это багом)

Пример, как вторая проблема может мешать. Если в результате регулярки у меня получается список с чётным количеством элементов, я прокручиваю его до конца и вижу, что последний элемент имеет номер 71. Не задумываясь, скажите — сколько элементов в списке на самом деле? Думаю, если спросить непрограммистов, на которых программа ориентирована, ответы разделятся: 70, 71, 72...
 
Последнее редактирование:

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 040
Баллы
113
тогда здесь почему так???? с ноля не с ноля а выдал вообще не то
 

Вложения

Nick

Client
Регистрация
22.07.2014
Сообщения
1 980
Благодарностей
815
Баллы
113
а, то есть в результате не должно было быть "line:" вообще?
это ещё ладно... вот список из одного элемента, в котором вообще нет первого элемента — это нонсенс)
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 708
Баллы
113
используется библиотека Net
Это не самописное чего-то
 

Nick

Client
Регистрация
22.07.2014
Сообщения
1 980
Благодарностей
815
Баллы
113
Ну ок, баг не в библиотеке, а в Конструкторе. Если он не только на том примере, но и на других каких-то тоже неправильно регулярки строит, это нужно исправлять. Или я что-то не понял?
 

LexxWork

Client
Регистрация
31.10.2013
Сообщения
1 190
Благодарностей
788
Баллы
113
к чему к чему, а к регулярке я бы никогда не придрался.
C# регулярка возможно не самая крутая но и не самая худшая
насчет того что писал визарт его личное мнение и далеко от правды.
а правда такая
^.*(?=")
 

wizard

Client
Регистрация
04.10.2011
Сообщения
991
Благодарностей
608
Баллы
93
к чему к чему, а к регулярке я бы никогда не придрался.
C# регулярка возможно не самая крутая но и не самая худшая
насчет того что писал визарт его личное мнение и далеко от правды.
а правда такая
^.*(?=")
если причины не такие как я говорил,
то хотелось бы знать правду...
почему в регулярке .*(?=") находит два занчения (цыфры и пустое), а в ^.*(?=") и \d+(?=") - только одно

Хочу понять для себя ))
 

LexxWork

Client
Регистрация
31.10.2013
Сообщения
1 190
Благодарностей
788
Баллы
113
Я могу только пообещать, что сообщу о правильном варианте если он здесь появится )
 

Nick

Client
Регистрация
22.07.2014
Сообщения
1 980
Благодарностей
815
Баллы
113
Меня регулярка сама по себе не очень интересует. У нас тут форум по продукту PM, в нём есть такой компонент — Конструктор регулярок.
Я ввёл простейшие данные и условие, по которому должен возвращаться один элемент, а возвращается — два. Очевидный баг. Что там внутри, какое звено в цепочке компонентов косячит — меня как пользователя не волнует; волнует только, чтобы был ожидаемый результат в этом компоненте.
 

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43

Nick

Client
Регистрация
22.07.2014
Сообщения
1 980
Благодарностей
815
Баллы
113
Ну то есть реально в тексте «1669">Абакан» есть не один, а два элемента, которые идут после двойной кавычки?
 

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43

LexxWork

Client
Регистрация
31.10.2013
Сообщения
1 190
Благодарностей
788
Баллы
113
Меня регулярка сама по себе не очень интересует.
а зря. еслиб интересовались, не задавали таких тупых
тривиальных вопросов.
 

wizard

Client
Регистрация
04.10.2011
Сообщения
991
Благодарностей
608
Баллы
93
по тому что у Вас получается регулярка .*(?=") , а . это любой символ (почти) , а * это 0 или более раз
вот в первом случае он находит цифры до знака "
а во втором НИЧЕГО до знака " (потому что цифры он уже находил )
все таки я был прав
вот скрин Notepad++ где видно что мы ищем в тексте где нет ни одного символа ... ищем регуляркой .* (любой символ 0 или более раз)
8.gif
причем регулярка .+ (любой символ 1 и более раз) ничего не находит.
Вывод: регулярка нашла нулевое совпадение
 

LexxWork

Client
Регистрация
31.10.2013
Сообщения
1 190
Благодарностей
788
Баллы
113
(facepalm)
правильный вывод:
регулярка нашла - это важно
регулярка нашла что? - ^ - начало строки!!!!!, но так как начало строки не имеет длины (и конец тоже), то результат есть а там "ничего"

.+ - выдает результат длиной 1 и более любых символов
.* - выдает результат длиной 0 и более любых символов

ужас как будто ребенку обьясняю...
 
  • Спасибо
Реакции: zortexx

wizard

Client
Регистрация
04.10.2011
Сообщения
991
Благодарностей
608
Баллы
93
(facepalm)
ужас как будто ребенку обьясняю...
не вижу ничего ужасного, обычный вопрос - желание разобраться...
а вот откуда у Вас такая заносчивость?
или вы думаете все обязаны знать то что знаете Вы, или Вы знаете все что знают другие?
-------------------------
Теперь по теме:
регулярка нашла что? - ^ - начало строки!!!!!
почему это не так
в тексте 111222 ищем регуляркой (?<=111).*(?=222) - мы тут ищем между 111 и 222 а значит и начало строки тут не может быть, но регулярка находит
---------------
второй пример
в пустом тексте мы ищем регуляркой [^^$]* - мы тут ищем НЕ начало строки и НЕ конец ноль раз - и регулярка находит
---------------
третий пример
регулярка .{1} в пустом тексте не находит ничего а .{0} находит одно совпадение

Вывод: пока тотже - регулярка нашла нулевое совпадение

P.S. если я ошибся - рад буду узнать где.
также не хочу никого обидеть, в том числе и LexxWork
 
Последнее редактирование:
  • Спасибо
Реакции: Roman* и Sergodjan

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 708
Баллы
113
в тексте 111222 ищем регуляркой (?<=111).*(?=222) - мы тут ищем между 111 и 222 а значит и начало строки тут не может быть, но регулярка находит
.+ - выдает результат длиной 1 и более любых символов
.* - выдает результат длиной 0 и более любых символов
 

LexxWork

Client
Регистрация
31.10.2013
Сообщения
1 190
Благодарностей
788
Баллы
113

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

wizard

Client
Регистрация
04.10.2011
Сообщения
991
Благодарностей
608
Баллы
93

человек рано или поздно делает выводы из своих ошибок, когда же вы начнете? я уже устал от вашей паранойи и ошибок в регулярках.
:D
ну да - для поиска знака $ (именно знака а не конца строки) его нужно было бы экранировать.
Извините, прочитав ваш пост в начале, думал что Вы действительно знаете - наверняка.
теперь все понял ...
P.S. Судя по вашим постам на форуме Вы действительно разбираетесь в разных вопросах... но именно тут, мы все выяснили, не обижайтесь )
 
  • Спасибо
Реакции: Roman*

LexxWork

Client
Регистрация
31.10.2013
Сообщения
1 190
Благодарностей
788
Баллы
113
да, я ошибся, признаю.
вы мне голову запудрили своими ругулярками
значит действительно нет никаго смысла в ^
[^^$]* находит ничего.
.* находит ничего
.*? тоже
скорей всего правила кванторов нерушимы и если у * строго говорится что 0 или больше, то это значит что 0 тоже результат.
возвращаемся к начальной регулярке
.*(?=")
перед кавычкой может быть два значения:
1. любые символы включая кавычку аж до последней кавычки
2. абсолютно ничего перед кавычкой (потому что такое свойство у квантора *)
*? повлияет только на первый результат поиска
как бы то ни было это не баг, а данность и если вы уговорите разрабов убирать из тестера и в других местах нулевые значения,
пользователи забудут как правильно составлять регулярки, полезут в шарпный кубик и заюзают стандартный метод. Что можно ожидать от этого? Новые жалобы, недоразумения... Вернут обратно все как было и поять кто-то задаст такой вопрос и опять все с начала.
 
Последнее редактирование:
  • Спасибо
Реакции: Sergodjan

Roman*

Client
Регистрация
25.09.2013
Сообщения
1 655
Благодарностей
656
Баллы
113
Скромность украшает, как по мне.
 

Nick

Client
Регистрация
22.07.2014
Сообщения
1 980
Благодарностей
815
Баллы
113
а зря. еслиб интересовались, не задавали таких тупых
тривиальных вопросов.
Вы могли бы мне такой вопрос задать на форуме программистов (правда, я бы там и эту тему не создавал), но мы тут на форуме среды разработки для не-программистов, обсуждаем как раз инструмент, который позволяет пользоваться регулярными выражениями, не зная их синтаксис. Эту регулярку не я сгенерил (я даже не рассматривал её); я задал запрос конструктору на простом тексте и получил неадекватный результат. Хорошо ещё, что в моём случае алгоритм работы проекта не зависит от этого ошибочно выдаваемого другого элемента — а если бы я количество элементов в списке-результате подсчитывал? Проект бы работал по-другому. Ну окей, я готов признать, что это фича, но, блин... жаль тогда, что нигде не написано, что Конструктор регулярок иногда генерит не те, регулярки, которые можно было бы ожидать. Я бы тогда пользовался вместо этого конструктора другой программой типа Regex Buddy.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)