Regex. Принцип эффективной работы - C#
Формулировка задачи:
Вопрос кратко:
что делать для эффективной работы Regex, если к одной и той же строке необходимо применить несколько паттернов поиска, которые взаимоисключают друг друга(то есть одна и та же конструкция не может удовлетворить сразу двум паттернам)
Развёрнутый вопрос:
Есть строка вида "какое-тоСловоЧисло,Число,Число-Число,Число-Число,Число"
"World5,10,13-25,27,29-35,55" - как пример.
то есть в начале строки находится слово, а дальше идёт перечисление через запятую либо чисел, либо комбинации на подобии "9-18", то есть диапазона. На выходе должна получиться коллекция строк вида
World5
World10
World13
World14
World15
...
Естественно, самый очевидный алгоритм в голове появился - сначала выцепить первое слово, а потом двумя Match по разным паттернам выцепить сначала диапазоны, затем числа. Задание тестовое, но стало интересно: "А что, если строки довольно большие, да и паттерны тоже не такие простые, да и много их?"
Как тогда действовать оптимальнее:
каждый раз проделывать Match по интересующей строке,
комбинировать Match и Replace, чтобы последующий Match работал уже с более короткой строкой (не убьёт ли создание новых строк выигрыш в поиске по более короткой строке),
а может есть какие-то ещё варианты?
И можно ли применить Replace и Match в один поход?
Решение задачи: «Regex. Принцип эффективной работы»
textual
Листинг программы
var m = Regex.Match(s, @"(?<word>[a-z, A-Z]+)(?:(?<firstInterval>\d+-\d+)|(?<firstNum>\d+))(?:,(?<interval>\d+-\d+)|,(?<num>\d+))*");
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д