0 / 0 / 0
Регистрация: 28.06.2019
Сообщений: 15
1

Найти в тексте все вхождения строки по шаблону

30.03.2020, 17:52. Показов 1951. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день
Задача такая - найти в тексте все вхождения строки и сложить эти вхождения в массив
Условия:
1. строка должна начинаться с цифры и заканчиваться цифрой.
2. в строке должны быть только цифры и два символа - * (умножить) и / (разделить).
3. пробельных символов в строке не должно быть.
4. количество цифр и указанных символов в строке не ограничено.

Заранее благодарю за помощь.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.03.2020, 17:52
Ответы с готовыми решениями:

В тексте, содержащем несколько предложений, найти все вхождения заданного слова и вывести все включающие его предложения
В тексте, содержащем несколько предложений, найти все вхождения заданного слова и вывести все...

Найти в тексте все вхождения данного образца
Здравствуйте! Очень нужна помощь. Задание: найти в тексте все вхождения данного образца. То есть...

Найти в тексте все вхождения данного образца
Буду рад любой помощи вообще непонятна сама организация поиска, помогите пожалуйста

В тексте, содержащем несколько (много) предложений, найти все вхождения заданного слова и распечатать все ключевые его предложения.
помогите решить 3 задачки. заранее большое спасибо всем! 1.P=\prod_{i=m}^{n}(2*i),где n и m...

16
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
30.03.2020, 18:45 2
Цитата Сообщение от alex291 Посмотреть сообщение
2. в строке должны быть только цифры и два символа - * (умножить) и / (разделить).
Одновременно? Т.е., вот такая запись верна? 12*4/67
Или по отдельности? 12*467 и 12/467
0
0 / 0 / 0
Регистрация: 28.06.2019
Сообщений: 15
30.03.2020, 19:38  [ТС] 3
Да, верна
1/2*5*7/8*87 - и такая верна
0
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
30.03.2020, 19:42 4
alex291, ~^\d+(?:\*\d+|/\d+)*\d*$~m
0
0 / 0 / 0
Регистрация: 28.06.2019
Сообщений: 15
30.03.2020, 19:53  [ТС] 5
Спасибо, конечно, только как это в массив собрать?
Такая конструкция не работает

preg_match_all("~^\d+(?:\*\d+|/\d+)*\d*$~m", $text, $matches);
0
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
30.03.2020, 20:02 6
alex291, См.демо, всё работает.
0
0 / 0 / 0
Регистрация: 28.06.2019
Сообщений: 15
30.03.2020, 20:02  [ТС] 7
Исходный текст "(5+7)*5+7/8*8+8*(9/3*4/2-7)";
Регулярное выражение должно вернуть массив из двух элементов
array[0] = '7/8*8';
array[1] = '9/3*4/2';
0
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
30.03.2020, 20:18 8
Цитата Сообщение от alex291 Посмотреть сообщение
Исходный текст "(5+7)*5+7/8*8+8*(9/3*4/2-7)";
Исходный текст НЕ соответствует описанию задачи в первом посту, т.к. кроме допустимых, содержит символы, которые небыли перечислены в списке разрешённых:

1. строка должна начинаться с цифры и заканчиваться цифрой.
В вашем случае в начале и в конце - что, цифры ?

2. в строке должны быть только цифры и два символа - * (умножить) и / (разделить).

4. количество цифр и указанных символов в строке не ограничено.

Добавлено через 7 минут
Цитата Сообщение от alex291 Посмотреть сообщение
Регулярное выражение должно вернуть массив из двух элементов
array[0] = '7/8*8';
array[1] = '9/3*4/2';
~\d+(?:\*\d+|/\d+)+~
PHP демо
1
Эксперт PHP
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
30.03.2020, 20:20 9
PHP
1
2
3
$str = "(5+7)*5+7/8*8+8*(9/3*4/2-7)";
preg_match_all("~\d+(\d*?[*\/])+\d~",$str, $result);
var_dump($result);
вариант
0
0 / 0 / 0
Регистрация: 28.06.2019
Сообщений: 15
30.03.2020, 20:30  [ТС] 10
Большое спасибо

Добавлено через 6 минут
Ваш вариант, к сожалению, не комильфо
возвращает ответ
Array
(
[0] => Array
(
[0] => 7/88*8
[1] => 9/3*4/2
)

[1] => Array
(
[0] => 88*
[1] => 4/
)

)


Вот у Строителя правильно

Array
(
[0] => Array
(
[0] => 7/88*8
[1] => 9/3*4/2
)

)
0
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
30.03.2020, 20:39 11
Лучший ответ Сообщение было отмечено Строитель как решение

Решение

alex291, если нужно комильфо, то лучше будет получать элементы в одномерном массиве:
PHP
1
2
3
4
5
6
7
8
9
10
11
$text = '(5+7)*5+7/8*8+8*(9/3*4/2-7)';
 
$matches = [];
! preg_match_all('~\d+(?:\*\d+|/\d+)+~', $text, $matches) ?: $matches = $matches[0];
 
var_dump($matches);
/*
array (size=2)
  0 => string '7/8*8' (length=5)
  1 => string '9/3*4/2' (length=7)
*/
0
Эксперт PHP
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
30.03.2020, 20:45 12
PHP
1
preg_match_all("~(\d+[*\/])+\d+~",$str, $result);
так лучше
0
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
30.03.2020, 20:48 13
Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
так лучше
Так - наоборот немного хуже. Не вводите в заблуждение.
0
Эксперт PHP
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
30.03.2020, 21:15 14
Цитата Сообщение от Строитель Посмотреть сообщение
Так - наоборот немного хуже. Не вводите в заблуждение.
аргументируйте примером
0
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
30.03.2020, 21:47 15
Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
аргументируйте примером
Хорошо ) Но в таком случае, я бы хотел сперва увидеть ваши аргументы, т.к. вы заявили, что ваш вариант лучше, но не потрудились пояснить причину.
0
Эксперт PHP
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
30.03.2020, 22:07 16
\*\d+|/\d+
отличается от
\d+[*\/]
что в вашем случае при чило + (5+)поиск вернется назад на одну позицию назад
но суть не в этом, "так лучше" я написал про свой код не ваш,
0
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
30.03.2020, 22:45 17
Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
что в вашем случае при чило + (5+)поиск вернется назад на одну позицию назад
Как вы это определили?
Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
"так лучше" я написал про свой код
Дак это было итак понятно, это не суть разговора.

Добавлено через 10 минут
Дабы тема не разрослась в бесполезный офтоп, я напишу вам, почему ваш вариант не лучше, а хуже. Во первых, он не много медленнее (а в случае поиска более чем на одной строке - ни не много, а довольно медленнее). Во вторых - затратнее по памяти, т.к. захватывает лишние совпадения, которые не будут использоваться алгоритмом программы.

Проверить это вы всегда можете на сервисе https://regex101.com/
1
30.03.2020, 22:45
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.03.2020, 22:45
Помогаю со студенческими работами здесь

Не могу получить все вхождения по шаблону.
Добрый день, пытаюсь вытащить из строки совпадения по маске, но получается вытащить только 1...

Найти все вхождения строки s в t
Требуется написать программу, которая выводить на экран идексы всех вхождений строки s в строку t:...

Найти все вхождения строки T в строке S
Найти все вхождения строки T в строке S. Входные данные: В первой строке входного потока...

Найти все вхождения строки Т в строке S
Найти все вхождения строки Т в строке S Помогите пожалуйста! И если можно на языке Си!!!


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

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

Новые блоги и статьи
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS, Swagger и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru