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

发布于 1周前 作者 ionicwang 来自 Flutter

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

简介

fluent_regex 是一个帮助以可读方式构建正则表达式的包。正则表达式在特定情况下非常有用,但它们也可能非常复杂难以理解。例如,根据 RFC 5322 标准解析电子邮件地址的正则表达式可能如下所示:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*
  |  "(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]
      |  \\[\x01-\x09\x0b\x0c\x0e-\x7f])*")
@ (?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
  |  \[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
       (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:
          (?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]
          |  \\[\x01-\x09\x0b\x0c\x0e-\x7f])+)
     \])

很少有人能够轻松读懂并理解这段代码。而使用 fluent_regex,我们可以更清晰地表达电子邮件地址的正则表达式:

var regex = FluentRegex()
    .startOfLine()
    .characterSet(
        CharacterSet().addLetters().addDigits().addLiterals(".-_"),
        Quantity.oneOrMoreTimes())
    .literal("@")
    .characterSet(
        CharacterSet().addLetters().addDigits().addLiterals(".-"),
        Quantity.oneOrMoreTimes())
    .literal(".")
    .characterSet(CharacterSet().addLetters(), Quantity.between(2, 4))
    .endOfLine();

对于完全符合 RFC 5322 标准的版本,请参阅 FluentRegex().emailAddress,它仍然复杂但更容易理解。

为什么选择这个包?

fluent_regex 包受 DartVerbalExpressions 的启发,并具有以下额外优势:

  • FluentRegex 实现了 RegExp
  • 所有方法都有一个可选的数量参数:不再混淆量词属于哪个部分
  • CharacterSet 类允许你流畅地定义括号表达式

示例代码

以下是 fluent_regex 的一些示例代码和用法:

安装

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

dependencies:
  fluent_regex: ^latest_version

然后运行 flutter pub getdart pub get 来安装包。

使用示例

验证电子邮件地址

import 'package:fluent_regex/fluent_regex.dart';

void main() {
  // 构建验证电子邮件地址的正则表达式
  var emailRegex = FluentRegex()
      .startOfLine()
      .characterSet(
          CharacterSet().addLetters().addDigits().addLiterals(".-_"),
          Quantity.oneOrMoreTimes())
      .literal("@")
      .characterSet(
          CharacterSet().addLetters().addDigits().addLiterals(".-"),
          Quantity.oneOrMoreTimes())
      .literal(".")
      .characterSet(CharacterSet().addLetters(), Quantity.between(2, 4))
      .endOfLine();

  // 测试电子邮件地址
  List<String> emails = [
    "example@example.com",
    "user.name+tag+sorting@example.com",
    "invalid-email",
    "user@.com",
    "user@domain..com"
  ];

  for (var email in emails) {
    if (emailRegex.hasMatch(email)) {
      print("'$email' is a valid email address.");
    } else {
      print("'$email' is NOT a valid email address.");
    }
  }
}

匹配电话号码

import 'package:fluent_regex/fluent_regex.dart';

void main() {
  // 构建匹配电话号码的正则表达式
  var phoneRegex = FluentRegex()
      .optional("(")
      .digit(Quantity.exactly(3))
      .optional(")")
      .optional("-")
      .digit(Quantity.exactly(3))
      .optional("-")
      .digit(Quantity.exactly(4));

  // 测试电话号码
  List<String> phones = [
    "(123)456-7890",
    "123-456-7890",
    "1234567890",
    "123-45-6789",
    "invalid-phone"
  ];

  for (var phone in phones) {
    if (phoneRegex.hasMatch(phone)) {
      print("'$phone' is a valid phone number.");
    } else {
      print("'$phone' is NOT a valid phone number.");
    }
  }
}

更多示例

更多示例可以参考 fluent_regex 测试文件

通过这些示例,你可以更好地理解和使用 fluent_regex 包来构建和处理正则表达式。希望这些信息对你有所帮助!


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

1 回复

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


当然,fluent_regex 是一个用于 Flutter 的 Dart 插件,它提供了一个流畅的 API 来处理正则表达式。下面是一个简单的示例,展示如何在 Flutter 应用中使用 fluent_regex 插件。

首先,确保你已经在 pubspec.yaml 文件中添加了 fluent_regex 依赖:

dependencies:
  flutter:
    sdk: flutter
  fluent_regex: ^0.2.0  # 请检查最新版本号

然后运行 flutter pub get 以获取依赖。

接下来是一个示例代码,展示如何使用 fluent_regex 来匹配和替换字符串中的正则表达式:

import 'package:flutter/material.dart';
import 'package:fluent_regex/fluent_regex.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Fluent Regex Example'),
        ),
        body: Center(
          child: Padding(
            padding: const EdgeInsets.all(16.0),
            child: FluentRegexExample(),
          ),
        ),
      ),
    );
  }
}

class FluentRegexExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    String inputText = "Hello, my email is test@example.com and my phone number is 123-456-7890.";
    String emailPattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}';
    String phonePattern = r'\d{3}-\d{3}-\d{4}';

    // 使用 fluent_regex 匹配电子邮件
    List<String> emails = FluentRegex(inputText)
        .find(emailPattern)
        .allMatches()
        .map((match) => match.group(0))
        .toList();

    // 使用 fluent_regex 替换电话号码
    String replacedText = FluentRegex(inputText)
        .replace(phonePattern, '***-***-****')
        .toString();

    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      crossAxisAlignment: CrossAxisAlignment.center,
      children: [
        Text("Original Text:\n$inputText"),
        SizedBox(height: 16),
        Text("Matched Emails:\n$emails"),
        SizedBox(height: 16),
        Text("Replaced Text:\n$replacedText"),
      ],
    );
  }
}

在这个示例中:

  1. 我们导入了 fluent_regex 包。
  2. 创建了一个简单的 Flutter 应用,其中包含一个示例文本字符串。
  3. 使用 FluentRegex 类来匹配字符串中的电子邮件地址,并将匹配结果存储在 emails 列表中。
  4. 使用 FluentRegex 类来替换字符串中的电话号码。
  5. 显示原始文本、匹配的电子邮件地址和替换后的文本。

运行这个应用,你会看到匹配到的电子邮件地址和替换后的电话号码显示在页面上。这个示例展示了如何使用 fluent_regex 插件进行基本的正则表达式匹配和替换操作。

回到顶部