|
Модераторы: ginnie |
|
Evghenusi |
|
|||
майский жук Профиль Группа: Участник Сообщений: 506 Регистрация: 3.8.2006 Где: Молдова, Кишинёв Репутация: нет Всего: 15 |
Доброго времени суток.
Ребят, я знаю что тут водятся Гуру, поэтому к вам и заглянул Регулярку для своего случая нашёл
И всё бы хорошо, но хочется вникнуть, а не бездумно использовать чужие плоды. Как я понимаю: находим цифру, дальше ?= вперёд смотрящее, получается что от цифры идём влево, но если верить поведению http://www.regexr.com/v1/ идём на три цифры влево с включительно ранее найденной, и дальше до бесконечности ищем по три цифры если после них символ не цифра..........бред какой-то написал. Сжальтесь, объясните пожалуйста регулярку. p.s. в Perl я ни бум бум, но знаю что там есть инструмент для просмотра выполнения регулярок, вот только он мне недоступен(( Это сообщение отредактировал(а) Evghenusi - 21.9.2014, 22:31 |
|||
|
||||
hobo1mts |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 21.6.2013 Репутация: 1 Всего: 1 |
Джеффри Фридл. Регулярные выражения. Третье издание.– СПб.: СимволПлюс, 2008. Со стр. 88 по 97 ОЧЕНЬ подробно разобран случай.
|
|||
|
||||
Evghenusi |
|
|||
майский жук Профиль Группа: Участник Сообщений: 506 Регистрация: 3.8.2006 Где: Молдова, Кишинёв Репутация: нет Всего: 15 |
спасибо, попробую найти)
|
|||
|
||||
Pfailed |
|
|||
Опытный Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 6 Всего: 39 |
||||
|
||||
Evghenusi |
|
|||
майский жук Профиль Группа: Участник Сообщений: 506 Регистрация: 3.8.2006 Где: Молдова, Кишинёв Репутация: нет Всего: 15 |
hobo1mts, спасибо больше за рекомендуемую книгу, понравилась.
Правда видимо я невнимательно читал, потому что конец регулярки - (?!\d) остался не понятен. К примеру возьмём число крупнее (хоть и нет разницы) - 999999999999999999999999999999999999999999.23 Если я правильно понимаю проверка идёт слева на право, находим цифру, а дальше проверяем что бы справа от неё было по три цифры. И если я правильно понимаю, так доходим до конца строки, но ведь мы проверяем кроме трёх знаков ещё и что бы после них не было цифры в конце - (?!\d). Пойти перечитать? Pfailed, спасибо) ооох, чёрт дёрнул меня за язык |
|||
|
||||
Evghenusi |
|
|||
майский жук Профиль Группа: Участник Сообщений: 506 Регистрация: 3.8.2006 Где: Молдова, Кишинёв Репутация: нет Всего: 15 |
аааа, кажется понял.
берётся строка, находим первую цифру, дальше ищем по три цифры до конца строки, и именно что бы по три цифры, иначе нам не подходит, и проверка что бы конец строки был или не число, не суть важно. И так проверяем для каждой цифры, и если условие сходится ставим разделитель. Получается для 999999999999999999999999999999999999999999.23 проделываются 42 итерации. Я правильно понял? Добавлено через 4 минуты и 16 секунд я до этого ошибочно полагал что разделитель ставится за одну итерацию Добавлено через 4 минуты и 49 секунд разделители ставятся* |
|||
|
||||
Pfailed |
|
||||||||||
Опытный Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 6 Всего: 39 |
Работает так.
На входе 999999999999999999999999999999999999999999.23 Первое выражение в регулярке отсекает первую цифру - она матчится
Дальше в действие вступает жадное выражение (\d{3})+ которое берёт по три цифры столько раз сколько может
Дальше ищем совпадение на (?!\d). Т.е за последней захваченной 9 должна быть не цифра. А у нас там
Т.е. весь матчинг на данном этапе оканчивается неудачно. Значит запятую после первой 9 выражение не поставит Так как у на указан модификатор /g то далее сдвинувшись на одну цифру вправо всё повторится Т.е теперь это
Очевидно, что на этом этапе всё снова окончится неудачно. И лишь на следующем
Взяли по три цифры столько раз сколько смогли. А дальше должна быть не цифра. А там действительно не цифра. Наконец то поиск закончился успешно! А значит после 3-й девятки сначала будет поставлена запятая. Далее вся история повторяется ещё много раз пока не будет достигнут конец строки. Собственно это краткий пересказ того, что выдаёт тот самый инструмент. Это сообщение отредактировал(а) Pfailed - 22.9.2014, 12:12 |
||||||||||
|
|||||||||||
Evghenusi |
|
|||
майский жук Профиль Группа: Участник Сообщений: 506 Регистрация: 3.8.2006 Где: Молдова, Кишинёв Репутация: нет Всего: 15 |
Pfailed, спасибо за объяснение, моя последняя теория оправдалась)
|
|||
|
||||
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |