Как не включить часть регулярного выражения - PullRequest
3 голосов
/ 09 июня 2010

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

Предположим, строка представляет собой любое количество пробелов или случайного текста и где-то внутри него.это «Значение: $ 1000,00».

Чтобы извлечь это значение, я сейчас использую это:

string value = Convert.ToString(Regex.Match(BodyContent, @"Value:[ \t]*\$?\d*(\.[0-9]{2})?", RegexOptions.Singleline));

Итак, переменная «значение» теперь имеет «Значение: $ 1000,00»хранится в нем.

Мой вопрос заключается в том, что с помощью Regex есть способ использовать 'Value:', чтобы найти числовое значение, но только сохранить фактическое числовое значение (т.е. 1000,00) в переменной 'value'?

Ответы [ 2 ]

3 голосов
/ 09 июня 2010

Вообще говоря, чтобы выполнить что-то подобное, у вас есть как минимум 3 варианта:

  • Используйте lookarounds (?=...), (?<=...), чтобы вы могли точно соответствовать тому, что вы хотите захватить
    • Некоторые языки имеют ограниченную поддержку lookbehinds
  • Используйте группу захвата (...) для захвата определенных строк
    • Почти универсально поддерживается во всех вариантах
  • Вы также можете просто взять substring матча
    • Хорошо работает, если длина префикса / суффикса для chop является известной константой

Ссылки


Примеры

С учетом этой тестовой строки:

i have 35 dogs, 16 cats and 10 elephants

Это совпадения некоторых шаблонов регулярных выражений:

Вы также можете сделать несколько снимков, например:

  • (\d+) (cats|dogs) дает 2 результата матча ( см. На rubular.com )
    • Результат 1: 35 dogs
      • Группа 1 захватывает 35
      • Группа 2 захватывает dogs
    • Результат 2: 16 cats
      • Группа 1 захватывает 16
      • Группа 2 захватывает cats

Решение этой конкретной проблемы

В этом случае гораздо проще использовать группу захвата ( см. На ideone.com ):

var text = "Blah blah Value: $1000.00 and more stuff";
string value = Convert.ToString(
   Regex.Match(
     text,
     @"Value:[ \t]*\$?(\d*(\.[0-9]{2})?)",
     RegexOptions.Singleline
   ).Groups[1]
);

Единственное, что было добавлено:

  • Пара совпадающих паразитов в шаблоне для захвата числовой части
  • Доступ к .Groups[1] объекта Match
2 голосов
/ 09 июня 2010

В .NET вам нужно получить объект Match, а затем получить доступ к его свойству Groups:

Match m = Regex.Match(BodyContent, @"Value:[ \t]*\$?(?<amount>\d*(\.[0-9]{2})?)", RegexOptions.Singleline);
string value = null;

if (m.Success)
{
    value = m.Groups["amount"].Value;
}

Синтаксис (?<amount> ... ) создает именованную группу захвата, которая хранится по имени в коллекции m.Groups.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...