Skip to content
This repository was archived by the owner on Feb 10, 2025. It is now read-only.

dart-archive/string_scanner

Folders and files

NameName
Last commit message
Last commit date

Latest commit

6921269 · Dec 17, 2024
Dec 1, 2024
Oct 31, 2022
Oct 9, 2024
Oct 9, 2024
Aug 13, 2018
Oct 9, 2024
Apr 1, 2021
Dec 17, 2024
Oct 29, 2024
Oct 9, 2024

Repository files navigation

Dart CI pub package package publisher

This package exposes a StringScanner type that makes it easy to parse a string using a series of Patterns. For example:

import 'dart:math' as math;

import 'package:string_scanner/string_scanner.dart';

num parseNumber(String source) {
  // Scan a number ("1", "1.5", "-3").
  final scanner = StringScanner(source);

  // [Scanner.scan] tries to consume a [Pattern] and returns whether or not it
  // succeeded. It will move the scan pointer past the end of the pattern.
  final negative = scanner.scan('-');

  // [Scanner.expect] consumes a [Pattern] and throws a [FormatError] if it
  // fails. Like [Scanner.scan], it will move the scan pointer forward.
  scanner.expect(RegExp(r'\d+'));

  // [Scanner.lastMatch] holds the [MatchData] for the most recent call to
  // [Scanner.scan], [Scanner.expect], or [Scanner.matches].
  var number = num.parse(scanner.lastMatch![0]!);

  if (scanner.scan('.')) {
    scanner.expect(RegExp(r'\d+'));
    final decimal = scanner.lastMatch![0]!;
    number += int.parse(decimal) / math.pow(10, decimal.length);
  }

  // [Scanner.expectDone] will throw a [FormatError] if there's any input that
  // hasn't yet been consumed.
  scanner.expectDone();

  return (negative ? -1 : 1) * number;
}