WedX - журнал о программировании и компьютерных науках

Разделить строку регулярного выражения, извлечь строковое значение до и числовое значение между квадратными скобками

Мне нужно разобрать string, который выглядит как «Abc[123]». Требуется числовое значение в скобках, а также значение string перед скобками.

Большинство примеров, которые я тестировал, работают нормально, но есть проблемы с анализом некоторых особых случаев.

Этот код, кажется, отлично работает для «обычных» случаев, но имеет некоторые проблемы с обработкой «особых» случаев:

var pattern = @"\[(.*[0-9])\]";
var query = "Abc[123]";
var numVal = Regex.Matches(query, pattern).Cast<Match>().Select(m => m.Groups[1].Value).FirstOrDefault();
var stringVal = Regex.Split(query, pattern)
                  .Select(x => x.Trim())
                  .FirstOrDefault();

Как следует настроить код для обработки некоторых особых случаев? Например, для строки «Abc[]» синтаксический анализатор должен правильно вернуть «Abc» в качестве строкового значения и указать пустое числовое значение (которое в конечном итоге может быть установлено по умолчанию равным 0). Для строки «Abc[xy33]» синтаксический анализатор должен вернуть «Abc» в качестве строкового значения и указать недопустимое числовое значение. Для строки «Abc» синтаксический анализатор должен вернуть «Abc» в качестве строкового значения и указать отсутствующее числовое значение. Пробелы до/после или внутри скобок должны быть обрезаны "Abc [ 123 ] ".

29.08.2019

Ответы:


1

Попробуйте этот шаблон: ^([^\[]+)\[([^\]]*)\]

Объяснение узора:

^ - соответствует началу строки

([^\[]+) - соответствует одному или нескольким любым символам, кроме [, и сохраняет их в первой группе захвата

\[ - соответствует [ буквально

([^\]]*) — соответствует нулю или более любых символов, кроме ], и сохраняется во второй группе захвата

\] - соответствует ] буквально

Вот проверенный код:

  var pattern = @"^([^\[]+)\[([^\]]*)\]";
  var queries = new string[]{ "Abc[123]", "Abc[xy33]", "Abc[]", "Abc[ 33 ]", "Abc" };
  foreach (var query in queries)
  {
    string beforeBrackets;
    string insideBrackets;
    var match = Regex.Match(query, pattern);
    if (match.Success)
    {
      beforeBrackets = match.Groups[1].Value;
      insideBrackets = match.Groups[2].Value.Trim();
      if (insideBrackets == "")
        insideBrackets = "0";
      else if (!int.TryParse(insideBrackets, out int i))
        insideBrackets = "incorrect value!";
    }
    else
    {
      beforeBrackets = query;
      insideBrackets = "no value";
    }
    Console.WriteLine($"Input string {query} : before brackets: {beforeBrackets}, inside brackets: {insideBrackets}");
  }

  Console.ReadKey();

Выход:

введите здесь описание изображения

29.08.2019
  • Спасибо, код, кажется, охватывает запрошенные варианты использования! 29.08.2019
  • Позднее редактирование: это не распространяется на случай, когда строка вообще не имеет скобок, например Abc. 29.08.2019
  • @RickyTad Обновленный ответ. 29.08.2019
  • Как следует изменить шаблон, чтобы иметь возможность обрабатывать необязательный дополнительный текст между скобками? Например, все они должны быть допустимыми строками: Abc[12], Abc[int:123], Abc[bool: 5], Abc[float : 32 ]. 29.08.2019

  • 2

    Мы можем попробовать заменить регулярное выражение на входе для однострочного решения:

    string input = "Abc[123]";
    string letters = Regex.Replace(input, "\\[.*\\]", "");
    string numbers = Regex.Replace("Abc[123]", ".*\\[(\\d+)\\]", "$1");
    Console.WriteLine(letters);
    Console.WriteLine(numbers);
    

    Это печатает:

    Abc
    123
    
    29.08.2019

    3

    Почти уверен, что для этого были бы какие-то языковые методы, о которых я не знал, но с регулярным выражением мы бы захватили все, используя группы захвата, и проверяли бы вещи один за другим, может быть:

    ^([A-Za-z]+)\s*(\[?)\s*([A-Za-z]*)(\d*)\s*(\]?)\s*$
    

    Если вы хотите изучить/упростить/изменить выражение, это объяснено на верхней правой панели regex101. ком. Если хотите, вы также можете посмотреть по этой ссылке, как она будет соответствовать против некоторых выборочных входных данных.


    29.08.2019

    4

    Вы можете легко добиться этого без использования регулярных выражений

    string temp = "Abc[123]";
    string[] arr =  temp.Split('[');
    string name = arr[0];
    string value = arr[1].ToString().TrimEnd(']');
    

    выходное имя = Abc и значение = 123

    29.08.2019
    Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]