C # Regex.Split - Subpattern возвращает пустые строки - PullRequest
6 голосов
/ 14 ноября 2009

Эй, первый постер в этом потрясающем сообществе.

У меня в приложении на C # есть регулярное выражение для анализа присваивания переменной:

NewVar = 40

, который вводится в текстовое поле. Я хочу, чтобы мое регулярное выражение возвращало (используя Regex.Split) имя переменной и значение, довольно просто. Это регулярное выражение, которое я имею до сих пор:

var r = new Regex(@"^(\w+)=(\d+)$", RegexOptions.IgnorePatternWhitespace);
var mc = r.Split(command);

Моя цель состояла в том, чтобы обрезать пропуски в Regex и не использовать метод Trim () возвращаемых значений. В настоящее время он работает, но возвращает пустую строку в начале MatchCollection и пустую строку в конце.

Используя приведенный выше пример ввода, это то, что возвращается из Regex.Split:

mc[0] = ""
mc[1] = "NewVar"
mc[2] = "40"
mc[3] = ""

Итак, мой вопрос: почему он возвращает пустую строку в начале и в конце?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 14 ноября 2009

Резонанс RegEx.Split возвращает четыре значения в том, что у вас есть ровно одно совпадение, поэтому RegEx.Split возвращает:

  • Весь текст перед вашим совпадением, который ""
  • Все () группы в вашем матче, которые "NewVar" и "40"
  • Весь текст после вашего матча, который ""

Основная цель RegEx.Split - извлечь любой текст между соответствующим регулярным выражением, например, вы можете использовать RegEx.Split с шаблоном "[,;]" для разделения текста на запятые или точки с запятой , В NET Framework 1.0 и 1.1 Regex.Split возвращал только разделенные значения, в данном случае "" и "", но в NET Framework 2.0 он был изменен, чтобы также включать значения, совпадающие с () в Regex, поэтому вы видя "NewVar" и "40" вообще.

То, что вы искали, это Regex.Match, а не Regex.Split. Он будет делать именно то, что вы хотите:

var r = new Regex(@"^(\w+)=(\d+)$");
var match = r.Match(command);
var varName = match.Groups[0].Value;
var valueText = match.Groups[1].Value;

Обратите внимание, что RegexOptions.IgnorePatternWhitespace означает, что вы можете включать в шаблон дополнительные пробелы - это не имеет никакого отношения к сопоставленному тексту. Поскольку в вашем шаблоне нет лишних пробелов, он не нужен.

1 голос
/ 14 ноября 2009

Из документов , Regex.Split() использует регулярное выражение в качестве разделителя для разделения. Он не разделяет захваченные группы из входной строки. Кроме того, IgnorePatternWhitespace игнорирует неэкранированные пробелы в вашем шаблоне, а не ввод.

Вместо этого попробуйте следующее:

var r = new Regex(@"\s*=\s*");
var mc = r.Split(command);

Обратите внимание, что пробел фактически используется как часть разделителя.

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