Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283

Поиск по регулярному выражению

16.04.2018, 15:47. Показов 1216. Ответов 4

Студворк — интернет-сервис помощи студентам
Доброго времени суток, есть необходимость проверки формулы по регулярному выражению. Написал регулярное выражение для поиска с таким шаблоном sqrt(x + y)

C#
1
 Regex sqrtRegex = new Regex(@"sqrt\([\(\)\\\{\}\s\+\-\/\*\w]+\)");
Но не могу понять, как переделать его что бы находить все вхождения в строку? То есть, если будет написано выражение
sqrt(sqrt(x)) должно найти два вхождения sqrt(x) и sqrt(sqrt(x)).
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.04.2018, 15:47
Ответы с готовыми решениями:

Установить соответствие строки регулярному выражению
Нужно сделать чтобы при нахождении строки a(ba)*b* появлялось сообщение что строка соответствует рег.выражению, но почему то если убрать...

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

Как найти строку в файле по регулярному выражению?
Получаю текст из файла с помощью ReadAllText. Регулярку подобрал ^.*.*$ В файле только одна строка подходит под регулярку, вот ее и...

4
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
16.04.2018, 17:23
Цитата Сообщение от ЗеХель Посмотреть сообщение
как переделать его что бы находить все вхождения в строку?
Вот один из вариантов:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
 
namespace Temp
{
   public class Program
   {
      public static void Main(string[] args)
      {
         string str = "12x - sqrt(sqrt(sqrt(x) + 33) + 2x) + sqrt(x+y) + 5";
 
         foreach(string s in GetAllEntryes(str))
         {
            Console.WriteLine(s);
         }
         Console.ReadKey();
      }
 
      public static string[] GetAllEntryes(string str)
      {
         HashSet<string> set = new HashSet<string>();
         Foo("");
         return set.ToArray();
 
         void Foo(string x)
         {
            string p = $@"sqrt\([^()]*{Regex.Escape(x)}[^()]*\)";
            foreach(Match m in Regex.Matches(str, p))
            {
               set.Add(m.Value);
               Foo(m.Value);
            }
         }
      }
   }
}
1
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283
16.04.2018, 21:00  [ТС]
Fleder, я не совсем понимаю, как работает эта строка:

C#
1
string p = $@"sqrt\([^()]*{Regex.Escape(x)}[^()]*\)";
Вот как я понимаю: sqrt(диапазон "всё, кроме () 0 или больше раз", далее интерполяция regex.escape(х), где x почему равен ""? и почему мы далее дублируем опять диапазон из начала?

Добавлено через 9 минут
А, или вот так: мы нашли вхождение sqrt( и далее отключаем условие окончания поиска ")" c помощью Escape("")? Но тогда все равно не понятно, зачем дальше снова диапазон стоит.
0
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
16.04.2018, 21:19
Цитата Сообщение от ЗеХель Посмотреть сообщение
я не совсем понимаю, как работает эта строка
Это паттерн, который создаётся динамически:
На первом этапе поиска он выглядит так: @"sqrt\([^()]*[^()]*\)"; и находит строку sqrt(x).
На втором этапе найденная ранее строка подставляется в паттерн и её метасимволы экранируются,
то есть sqrt(x) превращается в sqrt\(x\) и паттерн выглядит так:
@"sqrt\([^()]*sqrt\(x\)[^()]*\)";
И так далее. Происходит рекурсивный вызов матчинга с разными паттернами.

Добавлено через 13 минут
Цитата Сообщение от ЗеХель Посмотреть сообщение
и далее отключаем условие окончания поиска ")" c помощью Escape("")?
Нет. Regex.Escape(string) нужен для экранирования.

Добавлено через 3 минуты
Цитата Сообщение от ЗеХель Посмотреть сообщение
и почему мы далее дублируем опять диапазон из начала?
Это нужно для дальнейших матчингов, потому как там уже могут быть символы (которые могут идти перед закрывающей скобкой, но после предыдущего найденного совпадения, которое было подставлено в середину паттерна.
0
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283
16.04.2018, 22:03  [ТС]
Да, я понял после того, как сказали про динамический паттерн, я в упор не увидел что рекурсивно вызывается Foo(). Спасибо большое за помощь Fleder,
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.04.2018, 22:03
Помогаю со студенческими работами здесь

Кривое отображения русских букв в совпадении по регулярному выражению
dataFileName = parseDataFileName.Match(file).Value; Такая штука у меня находит текст в строке file по моему регулярному выражению...

Как правильно получить результат проверки по регулярному выражению?
Мой код: string Out = &quot;&quot;; string tamplate = @&quot;\w+&quot;; string s1 = &quot;русский &amp; english&quot;; Regex...

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

Каким образом благодаря регулярному выражению можно удалить все html теги с string?
Вот допустим у нас есть string , который считал html файл, и он выглядит например так: &lt;html...

Реализация конечного автомата по регулярному выражению
Здравствуйте, мне надо реализовать конечный автомат по регулярному выражению в алгебре Клини('*'-1 или больше предшествующих звезде...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru