0 / 6 / 0
Регистрация: 10.04.2016
Сообщений: 66

Атомарная группировка в PHP

15.06.2016, 02:48. Показов 1813. Ответов 5

Author24 — интернет-сервис помощи студентам
Читаю сейчас всеми известную книгу - Дж.Фридл - "Регулярные выражения". Дошел до момента с атомарной группировкой, и у меня загвоздка. Регулярка обрабатывает котировки вида
23.34000012
23.345
34.4000025
456.0029';.
И должна оставить 3 знака после точки. Имеет вид

"~(\.\d\d(?>[1-9]?))\d+~"

При попытке обработать число 23.345, По идее, как и описано в книге, в группировке должны остаться цифры .345. Но этого не происходит. Сначала совпадает точка \. , далее первая цифра 3 с \d, далее вторая цифра 4 захватывается \d, далее 5 подходит под выражения [1-9], но тогда не находится совпадения для \d+, т.к. должна быть хотя бы одна цифра, следовательно состояние атомарной группировки должно быть уничтожено и \d+ совпадет с цифрой 5. Но этого не происходит...Что не так? поддерживает ли вообще php атомарную группировку. Если да, то в чем отличие с Perl? Или может я че не догнал? У Фридла в книге на Perle типа все работает как задумано? Помогите пожалуйста разобраться...

Код ниже

PHP
1
2
3
4
5
6
7
8
$string = '23.34000012
23.345
34.4000025
456.0029';
 
preg_match_all("~(\.\d\d(?>[1-9]?))\d+~", $string, $matches);
 
print_r($matches);
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.06.2016, 02:48
Ответы с готовыми решениями:

Php группировка из двух таблиц
Привет всем, хочу сделать так, чтобы на сайте выводились только пользователь с которым у меня есть диалог. Я понял примерно как это сделать...

Парсинг JSON + группировка массивов - PHP Сети
Здравствуйте, уважаемые форумчане. Давно не заходил сюда и не обращался за помощью, но пришла пора. Итак, я получаю некие репорты в...

Атомарная операция
Всем добрый день. Я только начал изучать язык и прошу помочь разобраться. Как в методе transfer сделать атомарную операцию по...

5
Hello Kitty
 Аватар для WhiteMind
690 / 562 / 402
Регистрация: 12.02.2016
Сообщений: 1,436
Записей в блоге: 1
15.06.2016, 09:56
Цитата Сообщение от santaatnas Посмотреть сообщение
\d+
+ Одно или более {1,}
думаю так сработает
PHP
1
preg_match_all("~(\.\d\d(?>[1-9]?))\d*~", $string, $matches);
А еще лучше использовать что то вроде
PHP
1
preg_match_all("~(\.[1-9]{3}|\.[1-9]{2}|\.[1-9]|\.0\d{2}|\.0\d)~", $string, $matches);
---------
PHP
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$string = '23.34000012
23.345
34.4000025
1.10
456.0029';
 
preg_match_all("~(\.\d\d(?>[1-9]?))\d*~", $string, $matches);
 
preg_match_all("~(\.[1-9]{3}|\.[1-9]{2}|\.[1-9]|\.0\d{2}|\.0\d)~", $string, $matches);
 
print_r($matches);
Добавлено через 15 секунд
http://sandbox.onlinephpfuncti... 427e8c46a7
0
0 / 6 / 0
Регистрация: 10.04.2016
Сообщений: 66
15.06.2016, 13:11  [ТС]
Спасибо вам за труд, поменять регулярку можно, дело не в поиске решения, а в самой атомарной группировке (?>. ), и в том почему она не корректно себя ведет...
0
0 / 6 / 0
Регистрация: 10.04.2016
Сообщений: 66
15.06.2016, 14:11  [ТС]
j2FunOnly, Нет, я немного не дописал, там одним из условий округления идет тот факт, что третья цифра отличная от нуля. Но даже в предложенном Вами варианте, не будет совпадений к числу 23.345. Вот результат по Вашему коду:

PHP
1
Array ( [0] => Array ( [0] => .34000012 [1] => .4000025 [2] => .0029 ) [1] => Array ( [0] => .340 [1] => .400 [2] => .002 ) )
Как видите, только 3 совпадения.

Хотя по идее он должен сработать....В $matches[0] и $matches[1] должно попасть .345, и .34 соответственно....Но почему-то не попадет...
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
15.06.2016, 21:08
Лучший ответ Сообщение было отмечено santaatnas как решение

Решение

Цитата Сообщение от santaatnas Посмотреть сообщение
а в самой атомарной группировке (?>. ),
Не слышал такого выражения, но в официальной документации PHP (?> называются однократные подмаски.

Добавлено через 5 минут
Цитата Сообщение от santaatnas Посмотреть сообщение
При попытке обработать число 23.345,
[1-9]? работает в 2 этапа. первый - считает что там есть цифра, второй - считает что цифры там нет. Квалификатор (?> заставляет выполнять только один этап (первый) из всех возможных. Соответственно регулярка считает что эта цифра обязательно должна быть. В Вашем случае (?>[1-9]?) можно заменить на ([1-9]). Это равнозначно.
1
0 / 6 / 0
Регистрация: 10.04.2016
Сообщений: 66
16.06.2016, 02:25  [ТС]
pav1uxa, Не суть как это называется, во одних источниках, как http://www.regular-expressions.info/atomic.html, и книге Дж.Фридл, или как в источнике, который вы указали. Спасибо. Я изначально немного не так понял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.06.2016, 02:25
Помогаю со студенческими работами здесь

Атомарная операция
У меня есть такой класс: class CClass { public: bool state() const {return state_;} private: bool state_ = false; ...

mySql-PHP-группировка-вывод в браузер
Доброе всем время суток, нужна помощь в решении проблемы, я новичок поэтому прошу не судить строго. А вот и сама проблема: Есть таблица в...

Группировка
Доброго времени суток. Не пойму как получить из таблицы: поле1 поле2 666 ввв 777 ууу 666 ффф 777 ммм

Группировка
Скажите пожалуйста как сгруппировать элементы в Отчете- Анализ Счета по субконто..Например ЕСН и Заработная плата должны принадлежать...

Группировка
Здравствуйте. разбираю текстовые логи IIS domain\user ip Select-String -Path C:\tmp\logs\* -Pattern...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

Новые блоги и статьи
Реализация операторов Kubernetes
Mr. Docker 16.05.2025
Концепция операторов Kubernetes зародилась в недрах компании CoreOS (позже купленной Red Hat), когда команда инженеров искала способ автоматизировать управление распределёнными базами данных в. . .
Отражение в C# и динамическое управление типами
stackOverflow 16.05.2025
Reflection API в . NET — это набор классов и интерфейсов в пространстве имён System. Reflection, который позволяет исследовать и манипулировать типами, методами, свойствами и другими элементами. . .
Настройка гиперпараметров с помощью Grid Search и Random Search в Python
AI_Generated 15.05.2025
В машинном обучении существует фундаментальное разделение между параметрами и гиперпараметрами моделей. Если параметры – это те величины, которые алгоритм "изучает" непосредственно из данных (веса. . .
Сериализация и десериализация данных на Python
py-thonny 15.05.2025
Сериализация — это своего рода "замораживание" объектов. Вы берёте живой, динамический объект из памяти и превращаете его в статичную строку или поток байтов. А десериализация выполняет обратный. . .
Чем асинхронная логика (схемотехника) лучше тактируемой, как я думаю, что помимо энергоэффективности - ещё и безопасность.
Hrethgir 14.05.2025
Помимо огромного плюса в энергоэффективности, асинхронная логика - тотальный контроль над каждым совершённым тактом, а значит - безусловная безопасность, где безконтрольно не совершится ни одного. . .
Многопоточные приложения на C++
bytestream 14.05.2025
C++ всегда был языком, тесно работающим с железом, и потому особеннно эффективным для многопоточного программирования. Стандарт C++11 произвёл революцию, добавив в язык нативную поддержку потоков,. . .
Stack, Queue и Hashtable в C#
UnmanagedCoder 14.05.2025
Каждый опытный разработчик наверняка сталкивался с ситуацией, когда невинный на первый взгляд List<T> превращался в узкое горлышко всего приложения. Причина проста: универсальность – это прекрасно,. . .
Как использовать OAuth2 со Spring Security в Java
Javaican 14.05.2025
Протокол OAuth2 часто путают с механизмами аутентификации, хотя по сути это протокол авторизации. Представьте, что вместо передачи ключей от всего дома вашему другу, который пришёл полить цветы, вы. . .
Анализ текста на Python с NLTK и Spacy
AI_Generated 14.05.2025
NLTK, старожил в мире обработки естественного языка на Python, содержит богатейшую коллекцию алгоритмов и готовых моделей. Эта библиотека отлично подходит для образовательных целей и. . .
Реализация DI в PHP
Jason-Webb 13.05.2025
Когда я начинал писать свой первый крупный PHP-проект, моя архитектура напоминала запутаный клубок спагетти. Классы создавали другие классы внутри себя, зависимости жостко прописывались в коде, а о. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru