Шаблон регулярного выражения не обнаружен должным образом в C# - PullRequest
1 голос
/ 19 февраля 2020

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

У меня есть строка string test1 = "R1 0.1uF" и шаблон

"(?<des>^[a-zA-Z]+)|(?<number>\d+\s+)|(?<val>[0-9]*.?[0-9]+)|(?<units>[^,]*)";

Я хочу извлечь его следующим образом:

des: R

число: 1

val: 0.1

единицы: мкФ

В настоящее время des работает правильно и находит R, но остальные возвращают пустую строку.

Вот мой код

const string pattern = @"(?<des>^[a-zA-Z]+)|(?<number>\d+\s+)|(?<val>[0-9]*.?[0-9]+)|(?<units>[^,]*)";

string test1 = "R1 0.1uF";

Regex r = new Regex(pattern, RegexOptions.Compiled);

Match m = r.Match(test1);
string des = m.Groups["des"].Value;
string number = m.Groups["number"].Value;
string val = m.Groups["val"].Value;
string units = m.Groups["units"].Value;

1 Ответ

3 голосов
/ 19 февраля 2020

Два комментария:

  1. Удалите все | с, потому что вы не хотите совпадать с des OR number OR val OR units, но des followed by number followed by val followed by units
  2. Удалите точку: \. потому что вы хотите сопоставить точку, а не какой-то случайный символ.

Итак, ваше регулярное выражение становится

(?<des>^[a-zA-Z]+)(?<number>\d+\s+)(?<val>[0-9]*\.?[0-9]+)(?<units>[^,]*)

Посмотрите на regex101

Несколько небольших улучшений, если можно:

  • Переместите каретку ^ вперед. Он не относится к первой группе.
  • Не заполняйте пробелы в номере группы.

Примерно так:

^(?<des>[a-zA-Z]+)(?:(?<number>\d+)\s+)(?<val>[0-9]*\.?[0-9]+)(?<units>[^,]*)

См regex101

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