oniguruma_dart 1.0.1 copy "oniguruma_dart: ^1.0.1" to clipboard
oniguruma_dart: ^1.0.1 copied to clipboard

A pure-Dart port of the Oniguruma regex engine (backtracking bytecode VM). Full Unicode, ~28 encodings, an idiomatic String API. No FFI; verified against the C library.

example/oniguruma_dart_example.dart

// Example usage of oniguruma_dart, a pure-Dart port of the Oniguruma regex
// engine. Shows the idiomatic String API (recommended) and the low-level byte
// API (mirrors the C library, operating on Uint8List with byte offsets).
import 'dart:convert';
import 'dart:typed_data';

import 'package:oniguruma_dart/oniguruma_dart.dart';

void main() {
  // ---- Idiomatic String API ------------------------------------------------
  final re = OnigRegex.compile(r'(?<user>\w+)@(?<host>[\w.]+)');

  final m = re.firstMatch('contact bob@acme.com today');
  print(m?.group(0)); // bob@acme.com
  print(m?.namedGroup('user')); // bob
  print(m?.namedGroup('host')); // acme.com
  print(m?.start); // 8  (UTF-16 code-unit offset)

  // allMatches / replaceAll
  print(
    OnigRegex.compile(
      r'\d+',
    ).allMatches('a1 b22 c333').map((x) => x.group(0)).toList(),
  ); // [1, 22, 333]
  print(OnigRegex.compile(r'\s+').replaceAll('a  b   c', (_) => '_')); // a_b_c

  // Unicode-aware: properties, and case-insensitive multi-char folds (ß ↔ ss).
  print(OnigRegex.compile(r'\p{Han}+').firstMatch('東京タワー')?.group(0)); // 東京
  print(OnigRegex.compile(r'(?i)straße').firstMatch('STRASSE') != null); // true

  // ---- Low-level byte API (mirrors the C library) --------------------------
  final pattern = Uint8List.fromList(utf8.encode(r'a(.*)b|[e-f]+'));
  final subject = Uint8List.fromList(utf8.encode('zzzzaffffffffb'));

  final reg = onigNew(
    pattern,
    pattern.length,
    utf8Encoding,
    onigSyntaxDefault,
    OnigOption.defaultOption,
  );

  final region = OnigRegion();
  final start = onigSearch(
    reg,
    subject,
    subject.length,
    0,
    subject.length,
    region,
  );

  if (start >= 0) {
    print('match at byte $start');
    for (var i = 0; i < region.numRegs; i++) {
      print('  group $i: [${region.beg[i]}, ${region.end[i]})'); // byte offsets
    }
  } else if (start == OnigResult.mismatch) {
    print('no match');
  } else {
    print('error: ${onigErrorCodeToStr(start)}');
  }
}
1
likes
160
points
170
downloads

Documentation

API reference

Publisher

verified publisherbirju.dev

Weekly Downloads

A pure-Dart port of the Oniguruma regex engine (backtracking bytecode VM). Full Unicode, ~28 encodings, an idiomatic String API. No FFI; verified against the C library.

Repository (GitHub)
View/report issues
Contributing

Topics

#regex #regexp #oniguruma #regular-expression #unicode

License

BSD-2-Clause (license)

More

Packages that depend on oniguruma_dart