Задать вопрос
Slider_vm
@Slider_vm

Возможно ли сделать switch case по регулярному выражению?

Добрый день!
Как на c# сделать конструкцию вида:

switch(string)
          case регуялрка1:
          case регулярка2:
          case регулярка3:


UPD 1: Нужно проверить, что строка соответствует одному из регулярных выражений.
UPD 2: есть список файликов и в зависимости от названия их по разному парсить нужно
  • Вопрос задан
  • 2382 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@Sing303
bool IsMatch(string someString)
{
    var patterns = new[]
    {
        "someExpr1",
        "someExpr2",
        "someExpr3"
    };

    return patterns.Any(pattern => Regex.IsMatch(someString, pattern));
}


Читабельнее чем case или if, сразу видно по каким pattern`ам ищутся совпадения.
Any не будет проверять все patterns, выйдет при первом найденном и вернёт true

А чтобы сделать так, как вы ходите, вот оно:
var someStr = "someValue";
switch (true)
{
    case Regex.IsMatch(someStr, "somePattern1")
        // do...
        break;
    case Regex.IsMatch(someStr, "somePattern2")
        // do...
        break;
    case Regex.IsMatch(someStr, "somePattern3")
        // do...
        break;
}

Это будет, предположительно, работать с C#7, который ещё не вышел.

Для вашего случая можете попробовать что-то такое
void Main()
{
    var fileNameList = new List<string> { "fileNameOne", "fileNameTwo" };
    foreach (var fileName in fileNameList)
    {
        var fileAction = FileActions.FirstOrDefault(x => Regex.IsMatch(fileName, x.Key));
        if (fileAction.Key != null)
            fileAction.Value(fileName);
    }
}

IDictionary<string, Action<string>> FileActions = new Dictionary<string, Action<string>>
{
    { "somePatternOne", SomeActionOne },
    { "somePatternTwo", SomeActionTwo }
};

void SomeActionOne(string fileName) { /* Do... */ }
void SomeActionTwo(string fileName) { /* Do... */ }


Если код парсинга для каждого файла значительно отличается и кода много, вместо методов можно использовать классы (полиформизм)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@dmitryKovalskiy
программист средней руки
switch case ищет соответствие переменной string и ее возможное значение в case. Что вы хотите сопоставить? Что в переменной string хранится какое-то регулярное выражение? Или что string соответствует одному из регулярных выражений? Если второе, то ваш путь if else if.
Ответ написан
Nipheris
@Nipheris Куратор тега C#
есть список файликов и в зависимости от названия их по разному парсить нужно

А почему именно этот вопрос и не задать изначально? Сделайте IDictionary<string, Action<string>> и намапайте регулярку на действие.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы