Модераторы: ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> разделение числа по разрядам, (объясните пожалуйста регулярку) 
:(
    Опции темы
Evghenusi
Дата 21.9.2014, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


майский жук
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 3.8.2006
Где: Молдова, Кишинёв

Репутация: нет
Всего: 15



Доброго времени суток.
Ребят, я знаю что тут водятся Гуру, поэтому к вам и заглянул  smile 

Регулярку для своего случая нашёл
Код

"1231231.23".replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,") // "1,231,231.23"


И всё бы хорошо, но хочется вникнуть, а не бездумно использовать чужие плоды.

Как я понимаю: 
находим цифру, дальше ?= вперёд смотрящее, получается что от цифры идём влево, но если верить поведению http://www.regexr.com/v1/ идём на три цифры влево с включительно ранее найденной, и дальше до бесконечности ищем по три цифры если после них символ не цифра..........бред какой-то написал.

Сжальтесь, объясните пожалуйста регулярку.

p.s. в Perl я ни бум бум, но знаю что там есть инструмент для просмотра выполнения регулярок, вот только он мне недоступен((

Это сообщение отредактировал(а) Evghenusi - 21.9.2014, 22:31
PM WWW   Вверх
hobo1mts
Дата 22.9.2014, 06:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 21.6.2013

Репутация: 1
Всего: 1



Джеффри Фридл. Регулярные выражения. Третье издание.– СПб.: СимволПлюс, 2008. Со стр. 88 по 97 ОЧЕНЬ подробно разобран случай.
PM MAIL   Вверх
Evghenusi
Дата 22.9.2014, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


майский жук
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 3.8.2006
Где: Молдова, Кишинёв

Репутация: нет
Всего: 15



спасибо, попробую найти)
PM WWW   Вверх
Pfailed
Дата 22.9.2014, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 6
Всего: 39



Вот что выдаёт тот самый инструмент: http://jsfiddle.net/L7cbot1y/
Думаю, тут всё понятно


--------------------
PM MAIL   Вверх
Evghenusi
Дата 22.9.2014, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


майский жук
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 3.8.2006
Где: Молдова, Кишинёв

Репутация: нет
Всего: 15



hobo1mts, спасибо больше за рекомендуемую книгу, понравилась.

Правда видимо я невнимательно читал, потому что конец регулярки - (?!\d) остался не понятен.
К примеру возьмём число крупнее (хоть и нет разницы)   -    999999999999999999999999999999999999999999.23
Если я правильно понимаю проверка идёт слева на право, находим цифру, а дальше проверяем что бы справа от неё было по три цифры. И если я правильно понимаю, так доходим до конца строки, но ведь мы проверяем кроме трёх знаков ещё и что бы после них не было цифры в конце - (?!\d).

 smile 
Пойти перечитать?


Pfailed, спасибо) ооох, чёрт дёрнул меня за язык  smile 
PM WWW   Вверх
Evghenusi
Дата 22.9.2014, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


майский жук
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 3.8.2006
Где: Молдова, Кишинёв

Репутация: нет
Всего: 15



аааа, кажется понял.

берётся строка, находим первую цифру, дальше ищем по три цифры до конца строки, и именно что бы по три цифры, иначе нам не подходит, и проверка что бы конец строки был или не число, не суть важно. И так проверяем для каждой цифры, и если условие сходится ставим разделитель.
Получается для 999999999999999999999999999999999999999999.23 проделываются 42 итерации.

Я правильно понял?

Добавлено через 4 минуты и 16 секунд
я до этого ошибочно полагал что разделитель ставится за одну итерацию

Добавлено через 4 минуты и 49 секунд
разделители ставятся*
PM WWW   Вверх
Pfailed
Дата 22.9.2014, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 6
Всего: 39



Работает так.
На входе 999999999999999999999999999999999999999999.23
Первое выражение в регулярке отсекает первую цифру - она матчится
Код

(9)99999999999999999999999999999999999999999.23

Дальше в действие вступает жадное выражение (\d{3})+ которое берёт по три цифры столько раз сколько может
Код

(9){999}{999}{999}{999}{999}{999}{999}{999}{999}{999}{999}{999}{999}99.23
                                                                    ^
                                            тут выражение заматчить три цифры уже не может
                                                      поэтому останавливается

Дальше ищем совпадение на (?!\d). Т.е за последней захваченной 9 должна быть не цифра. А у нас там
Код

99.23

Т.е. весь матчинг на данном этапе оканчивается неудачно. Значит запятую после первой 9 выражение не поставит

Так как у на указан модификатор /g то далее сдвинувшись на одну цифру вправо всё повторится
Т.е теперь это
Код

9(9)9999999999999999999999999999999999999999.23

Очевидно, что на этом этапе всё снова окончится неудачно.
И лишь на следующем
Код

99(9){999}{999}{999}{999}{999}{999}{999}{999}{999}{999}{999}{999}{999}.23

Взяли по три цифры столько раз сколько смогли. А дальше должна быть не цифра. А там действительно не цифра. Наконец то поиск закончился успешно!
А значит после 3-й девятки сначала будет поставлена запятая. Далее вся история повторяется ещё много раз пока не будет достигнут конец строки.

Собственно это краткий пересказ того, что выдаёт тот самый инструмент.


Это сообщение отредактировал(а) Pfailed - 22.9.2014, 12:12


--------------------
PM MAIL   Вверх
Evghenusi
Дата 22.9.2014, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


майский жук
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 3.8.2006
Где: Молдова, Кишинёв

Репутация: нет
Всего: 15



Pfailed, спасибо за объяснение, моя последняя теория оправдалась)
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




[ Время генерации скрипта: 0.1191 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.