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

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

Enchanted regex

Dart 正则表达式 API 是现代正则表达式实现的一个坚实基础。但它仍然缺乏一些更复杂的功能(如更好地操作分组)和一些辅助函数。由于这些“问题”,创建了这个包。

• 🔗 分组操作

辅助函数和扩展功能将帮助我们操纵和映射正则表达式匹配中的命名分组。

String extensions

• 🌟 关于FindedGroup

✨ 这个类将在本包的主要函数中使用。

这是本包的“明星”类。一个比普通的MatchRegExpMatch类提供更多关于命名分组匹配信息的类。Dart 已经有命名分组。但是默认函数非常有限。我们不知道命名分组匹配开始/结束的位置。我们只知道它的内容——甚至不知道这些内容代表哪个命名分组(每个字符串中可以有很多命名分组)。因此,许多操作函数将返回一个更复杂的对象来表示每个匹配。这个模型就是FindedGroup

Atributes

通过FindedGroup类,您可以访问以下参数:

  • FindedGroup.name: 命名分组的名称。即正则表达式中分组名称,位于<>之间。

  • FindedGroup.content: 命名分组内容的字符串。不包括负向前瞻/后瞻的数据。

  • FindedGroup.fullMatchText: 命名分组的完整匹配。不仅仅是分组内容,还包括整个正则表达式的匹配。

  • FindedGroup.globalStart: 正则表达式匹配开始的位置。 ⚠️ 注意:这不是分组开始的位置,而是正则表达式匹配开始的位置。匹配开始和结束的位置在FindedGroup.startFindedGroup.end变量中。 因此,这相当于默认 Dart 的Match.start方法。

  • FindedGroup.globalEnd: 正则表达式匹配结束的位置。 ⚠️ 注意:这不是分组结束的位置,而是正则表达式匹配结束的位置。匹配开始和结束的位置在FindedGroup.startFindedGroup.end变量中。 因此,这相当于默认 Dart 的Match.end方法。

  • FindedGroup.start: 这是分组在正则表达式匹配中开始的位置。注意,这个值不是正则表达式匹配开始的位置,而是分组开始的位置。 例如:可能你在同一个正则表达式匹配中映射不同的分组,因此这个值将是该分组在正则表达式匹配中的起始位置。

  • FindedGroup.end: 这是分组在正则表达式匹配中结束的位置。注意,这个值不是正则表达式匹配结束的位置,而是分组结束的位置。 例如:可能你在同一个正则表达式匹配中映射不同的分组,因此这个值将是该分组在正则表达式匹配中的结束位置。

Functions

  • FindedGroup.copyWith(): 将创建一个精确副本,只替换你在copyWith函数中传递的参数。

• 🔧 辅助函数

提供额外功能的函数。

获取命名分组的文本

获取RegExpMatch或甚至Match中的完整文本。
PS: 是的,Dart 在其正则表达式 API 中没有这个非常简单的功能…

final String source = 'Hello, my name is <name>';
final RegExp regex = RegExp(r'(?<name>\w+)');
final RegExpMatch? match = regex.firstMatch(source);
print(match?.text); // .text 属性

添加 copyWith 方法到正则表达式

为正则表达式添加默认的 copyWith 实现。

这个方法用于创建一个新的具有原始属性相同的新正则表达式,但用给定的值替换。

final regex = RegExp(r'(?<name>\w+)', caseSensitive: true);
final newRegex = regex.copyWith(caseSensitive: false);

打印匹配列表

使用扩展功能快速打印并查看所有匹配。 你可以使用printListprintListWithLineBreak

final String source = 'Hello, my name is <name>';
final RegExp regex = RegExp(r'(?<name>\w+)');
final Iterable<RegExpMatch> matchs = regex.allMatches(source);

matchs.printListWithLineBreak();
matchs.printList();

完整示例Demo

下面是完整的示例代码,展示如何使用enchanted_regex插件来处理正则表达式。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Enchanted Regex Demo'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              final String source = 'Hello, my name is <name>, and I am <age> years old.';
              final RegExp regex = RegExp(r'(?<name>\w+)\s+(?<age>\d+)');

              final Iterable<RegExpMatch> matches = regex.allMatches(source);
              matches.forEach((match) {
                final FindedGroup nameGroup = match.group('name')!;
                final FindedGroup ageGroup = match.group('age')!;

                print('Name: ${nameGroup.content}, Age: ${ageGroup.content}');
              });
            },
            child: Text('Run Enchanted Regex Demo'),
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,我可以为你提供一个关于如何在Flutter项目中使用enchanted_regex插件来处理正则表达式的代码示例。enchanted_regex是一个强大的Flutter插件,它允许你以更直观和灵活的方式在Flutter应用中处理正则表达式。

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

dependencies:
  flutter:
    sdk: flutter
  enchanted_regex: ^latest_version  # 请替换为最新版本号

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

以下是一个简单的代码示例,展示了如何使用enchanted_regex插件来验证电子邮件地址:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Enchanted Regex Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: EmailValidationScreen(),
    );
  }
}

class EmailValidationScreen extends StatefulWidget {
  @override
  _EmailValidationScreenState createState() => _EmailValidationScreenState();
}

class _EmailValidationScreenState extends State<EmailValidationScreen> {
  final TextEditingController _emailController = TextEditingController();
  String? _validationMessage;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Email Validation with Enchanted Regex'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TextField(
              controller: _emailController,
              decoration: InputDecoration(
                labelText: 'Enter your email',
                border: OutlineInputBorder(),
              ),
            ),
            SizedBox(height: 16),
            Text(
              _validationMessage ?? '',
              style: TextStyle(color: Colors.red),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () {
                validateEmail();
              },
              child: Text('Validate Email'),
            ),
          ],
        ),
      ),
    );
  }

  void validateEmail() {
    // 定义电子邮件的正则表达式模式
    final emailRegex = EnchantedRegex(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$');

    // 检查输入是否匹配正则表达式
    if (emailRegex.hasMatch(_emailController.text)) {
      setState(() {
        _validationMessage = 'Email is valid';
      });
    } else {
      setState(() {
        _validationMessage = 'Email is invalid';
      });
    }
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,它包含一个文本字段用于输入电子邮件地址,以及一个按钮用于验证输入的电子邮件地址。我们使用EnchantedRegex类来定义一个电子邮件的正则表达式模式,并使用hasMatch方法来检查输入的字符串是否匹配该模式。

当用户点击“Validate Email”按钮时,应用会调用validateEmail方法,该方法会根据输入字符串是否匹配正则表达式来更新验证消息。

这个示例展示了enchanted_regex插件的基本用法,你可以根据需要扩展和修改这个示例以适应你的具体需求。

回到顶部