Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 15.04.2019, 23:56   #1
mikhail2019
 
Регистрация: 13.04.2019
Сообщений: 6
Репутация: 10
По умолчанию Пока не кончатся совпадения по регулярным выражениям

Доброго времени суток! Имеется массив с регулярными выражениями, как сделать так, чтобы пока есть соответствие с регулярным выражением из массива, вырезаем подстроку соответствующую этому регулярному выражению и идем дальше.
Для большего понимания прилагаю код:
Код:
string[] pattern = { @"([x])(\^)(\d+)", @"(\d+)([/])([x])", @"(\d+)(\^)([x])", @"([e])(\^)([x])", @"(\d+)([/])([(])sin(\^)2([(])([x])([)])([)])", @"(\d+)([/])([(])cos(\^)2([(])([x])([)])([)])", @"(\d+)([/])([(])sqrt([(])(\d+)([-])([x])(\^)2([)])([)])", @"(\d+)([/])([(])(\d+)([+])([x])(\^)2([)])", @"(\d+)([/])([(])(\d+)([-])([x])(\^)2([)])", @"(\d+)([/])([(])sqrt([(])([x])(\^)2([-+])(\d+)([)])([)])", @"sin([(])([x])([)])", @"cos([(])([x])([)])", @"([0])", @"([x])", @"(\d+)" };
                List<string> rezv = new List<string>();
                //я проверяю так, беру каждое регулярное выражение, и, если есть с ним совпадение, то запоминаю его, и удаляю из строки эту подстроку которая соответствует регулярному выражению
                for (int j = 0; j < pattern.Length; j++)
                {
                    Regex reg = new Regex(pattern[j]);
                    Match match = reg.Match(integral);
                    if (Regex.IsMatch(integral, pattern[j], RegexOptions.IgnoreCase) == true)
                    {
                        rezv.Add(match.Value);
                        integral = Regex.Replace(integral, pattern[j], "");
                    }
                    match = match.NextMatch();
                }
не понимаю как выполнять этот цикл for до тех пор пока не закончатся совпадения
mikhail2019 вне форума   Ответить с цитированием
Старый 16.04.2019, 00:07   #2
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 25,699
Репутация: 5617
По умолчанию

так?

Код:
             for (int j = 0; j < pattern.Length; j++)
             {
                    Regex reg = new Regex(pattern[j]);

                    foreach (Match ItemMatch in reg.Matches(integral))
                    {
                             integral = integral.Replace(ItemMatch.Value, "");
                    }
                }
Serge_Bliznykov вне форума   Ответить с цитированием
Старый 16.04.2019, 01:27   #3
mikhail2019
 
Регистрация: 13.04.2019
Сообщений: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
так?

Код:
             for (int j = 0; j < pattern.Length; j++)
             {
                    Regex reg = new Regex(pattern[j]);

                    foreach (Match ItemMatch in reg.Matches(integral))
                    {
                             integral = integral.Replace(ItemMatch.Value, "");
                    }
                }
ДА!!! огромное спасибо тебе Модератор!!!
mikhail2019 вне форума   Ответить с цитированием
Старый 23.04.2019, 02:28   #4
mikhail2019
 
Регистрация: 13.04.2019
Сообщений: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
так?

Код:
             for (int j = 0; j < pattern.Length; j++)
             {
                    Regex reg = new Regex(pattern[j]);

                    foreach (Match ItemMatch in reg.Matches(integral))
                    {
                             integral = integral.Replace(ItemMatch.Value, "");
                    }
                }
а возник еще такой вопрос, а как делать эти действия так чтобы вырезать в том же порядке в котором идет и во входной строке?
mikhail2019 вне форума   Ответить с цитированием
Старый 23.04.2019, 10:21   #5
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 25,699
Репутация: 5617
По умолчанию

Цитата:
Сообщение от mikhail2019 Посмотреть сообщение
а возник еще такой вопрос, а как делать эти действия так чтобы вырезать в том же порядке в котором идет и во входной строке?
не проверял, но разве это по умолчанию не так?

ну, попробуйте:
Код:
             for (int j = 0; j < pattern.Length; j++)
             {
                    Regex reg = new Regex(pattern[j]);
                    int ii=0;
                    foreach (Match ItemMatch in reg.Matches(integral))
                    {
                             integral = integral.Replace(ItemMatch.Value, "Шаблон "+j.ToString()+' Замена №'+ii.ToString());
                             ii+;
                    }
                }
или покажите пример, где это код работает в не в том порядке.
Serge_Bliznykov вне форума   Ответить с цитированием
Старый 23.04.2019, 17:04   #6
mikhail2019
 
Регистрация: 13.04.2019
Сообщений: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
не проверял, но разве это по умолчанию не так?

ну, попробуйте:
нет, я имею ввиду что в коде:
Код:
string[] pattern = { @"([x])(\^)(\d+)", @"(\d+)([/])([x])", @"(\d+)(\^)([x])", @"([e])(\^)([x])", @"(\d+)([/])([(])sin(\^)2([(])([x])([)])([)])", @"(\d+)([/])([(])cos(\^)2([(])([x])([)])([)])", @"(\d+)([/])([(])sqrt([(])(\d+)([-])([x])(\^)2([)])([)])", @"(\d+)([/])([(])(\d+)([+])([x])(\^)2([)])", @"(\d+)([/])([(])(\d+)([-])([x])(\^)2([)])", @"(\d+)([/])([(])sqrt([(])([x])(\^)2([-+])(\d+)([)])([)])", @"sin([(])([x])([)])", @"cos([(])([x])([)])", @"([x])", @"(\d+)", @"([0])" };
                List<string> rezv = new List<string>();
for (int j = 0; j < pattern.Length; j++)
{
    Regex reg = new Regex(pattern[j]);
    foreach (Match ItemMatch in reg.Matches(integral))
    {
        rezv.Add(ItemMatch.Value);
        integral = integral.Replace(ItemMatch.Value, "");
    }
}
в лист rezv записываются найденные подстроки не в том порядке в котором они расположены в исходной строке, например для строки sin(x)+x^2-cos(x), rezv[0] = x^2, rezv[1] = sin(x), rezv[2] = cos(x), а я хочу получить результат rezv[0] = sin(x), rezv[1] = x^2, rezv[2] = cos(x)
mikhail2019 вне форума   Ответить с цитированием
Старый 23.04.2019, 17:50   #7
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 25,699
Репутация: 5617
По умолчанию

теперь понял.

а Вам не кажется, что Вы решаете задачу не так, как надо? // если я правильно понял вашу задачу, конечно.
Это же классическая задача на разбор (парсер) математического выражения.

что найдёт ваш цикл, если будет, например cos( x + sin(x+x^2))

почитайте, например,
на стековерфлоу - Парсер математических выражений
Serge_Bliznykov вне форума   Ответить с цитированием
Старый 23.04.2019, 18:20   #8
mikhail2019
 
Регистрация: 13.04.2019
Сообщений: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
теперь понял.

а Вам не кажется, что Вы решаете задачу не так, как надо? // если я правильно понял вашу задачу, конечно.
да есть такое, но мне пока хотя бы так. как это возможно сделать?
mikhail2019 вне форума   Ответить с цитированием
Старый 23.04.2019, 18:47   #9
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 25,699
Репутация: 5617
По умолчанию

Цитата:
Сообщение от mikhail2019 Посмотреть сообщение
но мне пока хотя бы так.
зачем?!!!! Что это Вам даст?


Цитата:
Сообщение от mikhail2019 Посмотреть сообщение
как это возможно сделать?
ну, не знаю, запишите все выражения в один паттерн через |

Код:
string pattern = { @"([x])(\^)(\d+)|(\d+)([/])([x])|(\d+)(\^)([x])|([e])(\^)([x])|(\d+)([/])([(])sin(\^)2([(])([x])([)])([)])";

Regex reg = new Regex(pattern);
foreach (Match ItemMatch in reg.Matches(integral))
{
    rezv.Add(ItemMatch.Value);
    integral = integral.Replace(ItemMatch.Value, "");
}

ну, либо при добавлении в список rezv добавляйте в массив/структуру ItemMatch.Index и сортируйте по этому индексу
только тогда нужно заменять не на пустую строчку, а на строчку из символов,
которых заведомо не может быть в строке (например, @ и длиной строки строго равной длине ItemMatch.Value.
Serge_Bliznykov вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопросы по регулярным выражениям timbi C# (си шарп) 4 12.05.2013 18:57
Вопрос по регуярным выражениям PHP three_cats PHP 1 04.04.2013 15:51
Вопрос по регулярным выражениям fantom_ZET PHP 10 11.12.2010 00:26
stringgrid,сравнение двух столбцов на совпадения и не совпадения betirsolt БД в Delphi 7 19.01.2010 16:09
Проблема с регулярным выражением ssdm PHP 3 12.01.2010 19:26


09:13.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.