Регулярное выражение: продолжительность (часы, минуты) в дротике - PullRequest
1 голос
/ 15 февраля 2020

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

Пример вывода:

1: 22: 00.000000

Но у меня есть некоторые данные, которые также будут иметь минуты или часы.

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

  • Часы

  • Минуты

  • Часы и минуты

final _regExp = RegExp(r'(?<hours>\d+)h (?<minutes>\d+)m');
Duration _parseDuration(String line) {
  final match = _regExp.firstMatch(line);

  if (match == null) {
    throw Exception('Could not get duration from: $line');
  }

  return Duration(
      hours: int.parse(match.namedGroup('hours')),
      minutes: int.parse(match.namedGroup('minutes')));
}

Я Не знаете, как это сделать?

Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 15 февраля 2020

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

(?:(?:(\d+)h )?(\d+)m|(\d+)h)
  • (?: Группа без захвата
    • (?:(\d+)h )? Захват группа 1 , сопоставление необязательных цифр и h
    • (\d+)m Захват группа 2 , сопоставление 1+ цифр и m
    • | Или
    • (\d+)h Захват группа 3 , совпадение цифр 1+ и h
  • ) Закрыть группу

Regex demo | Дартс демо

Часы в группе 1 или 3, минуты в группе 2.

Я не знаком с Дартом, так что, вероятно, есть лучший способ написать это, но для идеи я добавил пример.

final _regExp = RegExp(r'(?:(?:(\d+)h )?(\d+)m|(\d+)h)');
Duration _parseDuration(String line) {
  final match = _regExp.firstMatch(line);

  if (match == null) {
    throw Exception('Could not get duration from: $line');
  }
  String h = match.group(1) ?? match.group(3) ?? "00";
  String m = match.group(2) ?? "00";


  return Duration(
      hours: int.parse(h),
      minutes: int.parse(m));
}
0 голосов
/ 15 февраля 2020

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

void main() {
  print(_parseDuration('5h'));      // 5:00:00.000000
  print(_parseDuration('5m'));      // 0:05:00.000000
  print(_parseDuration('10h 50m')); // 10:50:00.000000
}

final _regExp = RegExp(r'((?<hours>\d+)h)?[ ]*((?<minutes>\d+)m)?');
Duration _parseDuration(String line) {
  final match = _regExp.firstMatch(line);

  if (match == null) {
    throw Exception('Could not get duration from: $line');
  }

  return Duration(
      hours: int.parse(match.namedGroup('hours') ?? '0'),
      minutes: int.parse(match.namedGroup('minutes') ?? '0'));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...