Пропустил первый матч с моим текущим регулярным выражением - PullRequest
0 голосов
/ 11 октября 2019

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

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

Регулярное выражение, которое у меня есть, (?<=[\+\-\*\/])-?[.\d]+ Строка, в которой я пытаюсь определить все действительные числа: 6+3*6.3+-2

Я бы ожидал, что число совпадений будет равно "6", "3"," 6.3 "и" -2 ", но он пропускает первые" 6 ". Я ни в коем случае не эксперт по регулярным выражениям, помогите!

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Регулярное выражение (?<=[\+\-\*\/])-?[.\d]+ требует (поскольку (?<=...) является положительным взглядом сзади) -, +, * или / перед необязательным -, а затем 1+ цифры или точки. Вы можете изменить логику и использовать негативный взгляд, который будет проверять, нет ли другого символа, кроме -, +, * или / перед числом.

Говоря о сопоставлении числа: [.\d]+ не обязательно соответствует цифре, она может соответствовать строке ...... Вам следует подумать об изменении его на \d+(?:\.\d+)? или \d*\.?\d+.

Кроме того, вам не нужно экранировать математические операторы, если вы используете [+/*-] класс символов.

Итак, вы можетерешить проблему, используя

var results = Regex.Matches(text, @"(?<![^+/*-])-?\d*\.?\d+")
     .Cast<Match>()
     .Select(x => x.Value);

См. демонстрационную версию regex

Подробнее

  • (?<![^+/*-]) - началостроки или позиции, которой непосредственно предшествует +, -, * или -
  • -? - необязательный -
  • \d*- 0+ цифр
  • \.? - опционально .
  • \d+ - 1+ цифр.
0 голосов
/ 11 октября 2019

Ты очень близок к решению. Попробуйте это и дайте нам знать, как это происходит.

((?<=\+)-?)?([.\d]+)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...