Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/40: Рейтинг темы: голосов - 40, средняя оценка - 4.75
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178

Перед квантификатором {x,y} ничего нет, регулярные выражения

02.12.2016, 22:14. Показов 8127. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, мне необходимо в входной строке вида x + x2 -sqrt(y) + (-1+x) заменить переменные на случайные числа,с переменными отделенными знаками пробела или переменными с индексом проблем не возникает, а вот заменить переменные с знаками мат операций(+ - \ *) получается ошибка: выполняется разбор "+x" - Перед квантификатором {x,y} ничего нет.
Кусочек кода:
C#
1
2
3
4
5
6
7
8
9
10
 if (line != "")
        {
                Regex rgx = new Regex(@"(-|\+|\*|\/)[a-z][0-9]?");
                Random random = new Random();
                foreach (Match ItemMatch in rgx.Matches(line))
                {
                    line = Regex.Replace(line, ItemMatch.ToString(), random.Next(1, 30).ToString());
                }
                return 0;
            }
Я так понимаю что это происходит из-за того,что найденное совпадение +x воспринимается не как строка для замены а как регулярное выражение, но как решить эту проблему я не нашел, буду благодарен за наводку.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.12.2016, 22:14
Ответы с готовыми решениями:

Регулярные выражения. Продублировать слово перед запятой
string myText = "текст,текст"; const string myReg = ","; MatchCollection myMatch = Regex.Matches(myText,...

ЧПУ. Замена строк, регулярные выражения. Как правильно использовать переменную в регулярные выражения ?
Здравствуйте! Решил реализовать ЧПУ на своем сайте. Первый этап это замена всех реальных ссылок на чпу ссылки. Так вот при замене я...

Регулярные выражения - ошибок нет, но код не работает
Не могу понять что не так? TNewThread = class(TThread) private site:string; html:TStringList; rege:tregexpr; ...

9
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
02.12.2016, 22:31
Лучший ответ Сообщение было отмечено Vlad_ как решение

Решение

C#
1
Regex.Escape(ItemMatch.Value)
Добавлено через 4 минуты
C#
1
Regex rgx = new Regex(@"(?<!\w)[a-z][0-9]?(?=(?!\w))");
Добавлено через 18 секунд
А то ваш вариант не работал

Добавлено через 1 минуту
Правда мой тоже

Добавлено через 1 минуту
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
using System.Linq;
using System.Text.RegularExpressions;
 
class Program
{
    static void Main(string[] args)
    {
        Regex rgx = new Regex(@"(?<!\w)[a-z][0-9]?(?=(?!\w))");
        Random random = new Random();
        string line = "x + x2 -sqrt(y) + (-1+x)";
        foreach (Match itemMatch in rgx.Matches(line).Cast<Match>().OrderByDescending(match => match.Value.Length))
        {
            line = Regex.Replace(line, Regex.Escape(itemMatch.ToString()), random.Next(1, 30).ToString());
        }
        Console.WriteLine(line);
    }
}
1
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
02.12.2016, 22:46  [ТС]
TopLayer, Спасибо за подсказку, единственный момент который ещё есть, в функции у меня встречается max(x1, 5) и заменяется x в слове max, как этого избежать?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18288 / 14211 / 5368
Регистрация: 17.03.2014
Сообщений: 28,889
Записей в блоге: 1
02.12.2016, 22:54
Vlad_, используй обычный string.Replace
0
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
02.12.2016, 23:02
Vlad_, а с какой целью вы заменяете знаки операций?
C#
1
2
3
4
5
6
7
8
9
var rnd = new Random();
var text = "x + x + y + 123";
var pattern = @"\b(?!cos|sin|sqrt|abc)[a-z]\w*\b";
var hs = new Dictionary<string, string>();
text = Regex.Replace(text, pattern, m =>
{
    if (!hs.ContainsKey(m.Value)) hs[m.Value] = rnd.Next(30).ToString();
    return hs[m.Value];
});
0
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
02.12.2016, 23:02  [ТС]
OwenGlendower, обычный это public string Replace(
string oldValue,
string newValue
)?
Если да, то как мне это поможет? Обычный Replace вернет просто первую замену которую найдет в строке.
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
02.12.2016, 23:05
Лучший ответ Сообщение было отмечено Vlad_ как решение

Решение

Vlad_,
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
 
class Program
{
    static void Main(string[] args)
    {
        Regex rgx = new Regex(@"(?<!\w)[a-z][0-9]?(?=(?!\w))");
        Random random = new Random();
        string line = "x + x2 -sqrt(y) + (-1+x) + max(x1, 5)";
        var variables = new Dictionary<string, int>();
        line = rgx.Replace(line, match =>
        {
            if (!variables.ContainsKey(match.Value))
            {
                variables[match.Value] = random.Next(1, 30);
            }
            return variables[match.Value].ToString();
        });
        Console.WriteLine(line);
    }
}
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18288 / 14211 / 5368
Регистрация: 17.03.2014
Сообщений: 28,889
Записей в блоге: 1
02.12.2016, 23:05
Vlad_, метод Replace вернет новую строку где все вхождения oldValue заменены newValue. То есть сделает именно то что тебе нужно.
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
02.12.2016, 23:07
Ну и регулярку по-понятнее
C#
1
Regex rgx = new Regex(@"(?<=\b)[a-z][0-9]?(?=\b)");
0
7 / 7 / 4
Регистрация: 07.09.2012
Сообщений: 178
02.12.2016, 23:09  [ТС]
TopLayer, Отличное решение, тему можно закрыть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.12.2016, 23:09
Помогаю со студенческими работами здесь

Регулярные выражения - вывод всех файлов, в имени которых нет указанного символа
Добрый день. Я тут начал работать с регулярными выражениями. Так вот по-моему команда ls ** должна выводить все файлы, в имени...

Регулярные выражения. Подставить найденное число, а если его нет, подставить единицу
В общем, нужно найти слово, и если после него нет числа, то в подстановке вставить единицу, иначе если нашли число, подставить его в то же...

Регулярные выражения - вывод сообщения об ошибке при нахождении в строке выражения, начинающегося с цифры
Нужно чтобы при нахождении в строке выражения начинающегося с цифры появлялось сообщение об ошибке,например если ввести :2a,то будет...

Регулярные выражения: вставка символов в середину найденного выражения
Есть строки типа этого: &quot;В году 1783 марта месяца произошло событие, которые на долго запомнилось&quot;78. регулярное выражение...

Задержка перед выполнением, ничего не получается
Помогите реализовать задержку перед выполнением одной функций, но так чтобы могли выполнятся другие функции. Sleep(); замораживает всю...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru