Flutter正则表达式处理插件fancy_regex的使用

Flutter正则表达式处理插件fancy_regex的使用

功能特性

如果你在编写正则表达式时遇到困难,或者不习惯使用内置的RegExp类,那么你可以开始学习如何使用这个包来实现正则表达式。

该包提供了API,使你能够通过更详细但更易读的类和方法来编写正则表达式。如果你已经非常擅长编写正则表达式,那么你可能不需要这个包。

开始使用

首先,在你的pubspec.yaml文件中添加依赖项:

dependencies:
  fancy_regex: ^0.1.0

然后导入该包:

import 'package:fancy_regex/fancy_regex.dart';

基本用法

你可以使用两种不同的方式来创建正则表达式对象。

  1. 建造者模式:实例化一个基础的RegExpComponent表达式,然后可以通过提供的扩展方法进行扩展。
  2. 类似Flutter小部件树风格:每个实现了RegExpComponent的类都可以在其内部包装另一个RegExpComponent表达式。

以下是一个示例,展示如何使用这两种方式来创建一个表示/\+628\d{8,13}/的正则表达式:

// 使用小部件树风格
RegExp treeExp = FancyRegex(
  expression: SerialExpressions(
    [
      CharacterClass.literal("+"),
      RawExpression("628"),
      MatchRangedCount(
        CharacterClass.digits(),
        8,
        end: 13,
      ),
    ],
  ),
);

// 使用建造者模式
RegExp builderExp = FancyRegex(
  expression: CharacterClass.literal("+")
      .addRight(RawExpression("628"))
      .addRight(CharacterClass.digits().matchBetween(start: 8, end: 13)),
);

示例代码

下面是一些具体的示例代码,展示了如何使用fancy_regex插件来处理字符串匹配。

import 'package:fancy_regex/fancy_regex.dart';
import 'package:flutter/foundation.dart';

void main() {
  _basicExample();
  _phoneNumberExample();
  _phoneNumberExample2();
  _emailExample();
}

void _basicExample() {
  RegExp exp = FancyRegex(
    expression: const CharacterClass.alphanumeric()
        .matchOneOrMore()
        .toCaptureGroup(),
  );
  const String str = "Parse my string";
  Iterable<RegExpMatch> matches = exp.allMatches(str);
  if (kDebugMode) {
    print(exp.pattern);
    print(matches.map((e) => e.group(0)));
    print(matches.isNotEmpty);
  }

  exp = FancyRegex(
    expression: const CaptureGroup(
      MatchOneOrMore(
        CharacterClass.alphanumeric(),
      ),
    ),
  );
  matches = exp.allMatches(str);
  if (kDebugMode) {
    print(exp.pattern);
    print(matches.map((e) => e.group(0)));
    print(matches.isNotEmpty);
  }
}

void _phoneNumberExample() {
  final RegExp regex = FancyRegex(
    expression: InputBoundary(
      SerialExpressions(
        [
          CharacterClass.literal("+"),
          const RawExpression("628"),
          const MatchRangedCount(
            CharacterClass.digits(),
            8, end: 13,
          ),
        ],
      ),
      start: true,
      end: true,
    ),
  );
  final testResult = regex.hasMatch("+6285932564660");
  if (kDebugMode) {
    print(regex.pattern);
    print(testResult);
  }
}

void _phoneNumberExample2() {
  final RegExp regex = FancyRegex(
    expression: SerialExpressions(
      [
        CharacterClass.literal("+"),
        const RawExpression("628"),
      ],
    ).addRight(
      const CharacterClass.digits().matchBetween(start: 8, end: 13),
    ).matchWholeLine(),
  );
  final testResult = regex.hasMatch("+6285932564660");
  if (kDebugMode) {
    print(regex.pattern);
    print(testResult);
  }
}

void _emailExample() {
  const emailAllowedSymbols = [
    "!", "#", "$", "%", "&", "'", "*", "+", "/", "=", "?", "^", "_", "`", "{", "|", "}", "~", '"',
  ];
  final emailAllowedSymbolExp = MatchOneOrMore(
    CharacterGroup(
      [
        const CharacterGroupRange.lowerCased(),
        const CharacterGroupRange.digits(),
        CharacterGroupRange.fromArray(emailAllowedSymbols),
      ],
    ),
  );
  const allowedEmailNonSymbolsExp = CharacterGroup(
    [
      const CharacterGroupRange.lowerCased(),
      const CharacterGroupRange.digits(),
    ],
  );
  final allowedEmailNonSymbolsHyphen = CharacterGroup(
    [
      const CharacterGroupRange.lowerCased(),
      const CharacterGroupRange.digits(),
      CharacterGroupRange.fromArray(["-"]),
    ],
  );

  final RegExp regex = FancyRegex(
    expression: SerialExpressions(
      [
        emailAllowedSymbolExp,
        MatchZeroOrMore(
          CaptureGroup(
            SerialExpressions(
              [
                CharacterClass.literal("."),
                emailAllowedSymbolExp,
              ],
            ),
            nonCapturing: true,
          ),
        ),
        const RawExpression("@"),
        MatchOneOrMore(
          CaptureGroup(
            SerialExpressions(
              [
                allowedEmailNonSymbolsExp,
                MatchZeroOrOne(
                  CaptureGroup(
                    SerialExpressions(
                      [
                        MatchZeroOrMore(
                          allowedEmailNonSymbolsHyphen,
                        ),
                        allowedEmailNonSymbolsExp,
                      ],
                    ),
                    nonCapturing: true,
                  ),
                ),
                CharacterClass.literal("."),
              ],
            ),
            nonCapturing: true,
          ),
        ),
        allowedEmailNonSymbolsExp,
        CaptureGroup(
          MatchZeroOrOne(
            SerialExpressions(
              [
                allowedEmailNonSymbolsHyphen,
                allowedEmailNonSymbolsExp,
              ],
            ),
          ),
          nonCapturing: true,
        ),
      ],
    ),
    caseSensitive: true,
  );
  final testResult = regex.hasMatch("infinia249@gmail.com");
  if (kDebugMode) {
    print(regex.pattern);
    print(testResult);
  }
}

更多关于Flutter正则表达式处理插件fancy_regex的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter正则表达式处理插件fancy_regex的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


fancy_regex 是一个 Flutter 插件,提供了对正则表达式的支持,并且支持一些高级的正则表达式特性,如回溯、命名捕获组等。它是对 Dart 原生 RegExp 的扩展,提供了更强大的正则表达式功能。

安装 fancy_regex

首先,你需要在 pubspec.yaml 文件中添加 fancy_regex 依赖:

dependencies:
  fancy_regex: ^2.0.0

然后运行 flutter pub get 来安装依赖。

使用 fancy_regex

fancy_regex 的使用方式与 Dart 原生的 RegExp 类似,但它支持更多高级特性。

1. 基本用法

import 'package:fancy_regex/fancy_regex.dart';

void main() {
  final regex = FancyRegex(r'\d+');
  final match = regex.firstMatch('There are 42 apples.');
  
  if (match != null) {
    print('Match found: ${match.group(0)}'); // 输出: Match found: 42
  } else {
    print('No match found.');
  }
}

2. 使用命名捕获组

fancy_regex 支持命名捕获组,你可以通过名称来访问匹配的组。

import 'package:fancy_regex/fancy_regex.dart';

void main() {
  final regex = FancyRegex(r'(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})');
  final match = regex.firstMatch('Today is 2023-10-05.');
  
  if (match != null) {
    print('Year: ${match.namedGroup('year')}'); // 输出: Year: 2023
    print('Month: ${match.namedGroup('month')}'); // 输出: Month: 10
    print('Day: ${match.namedGroup('day')}'); // 输出: Day: 05
  } else {
    print('No match found.');
  }
}

3. 使用回溯

fancy_regex 支持回溯,可以处理更复杂的正则表达式。

import 'package:fancy_regex/fancy_regex.dart';

void main() {
  final regex = FancyRegex(r'(\d+)+');
  final match = regex.firstMatch('12345');
  
  if (match != null) {
    print('Match found: ${match.group(0)}'); // 输出: Match found: 12345
  } else {
    print('No match found.');
  }
}

4. 使用替换功能

fancy_regex 也支持替换功能,类似于 Dart 原生的 RegExp

import 'package:fancy_regex/fancy_regex.dart';

void main() {
  final regex = FancyRegex(r'\d+');
  final result = regex.replaceAll('There are 42 apples.', 'many');
  
  print(result); // 输出: There are many apples.
}
回到顶部