Flutter正则表达式构建插件verbal_expressions的使用

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

Flutter正则表达式构建插件verbal_expressions的使用

简介

verbal_expressions 是一个帮助 Dart 开发者构建复杂正则表达式的库。它通过提供一系列链式调用的方法,使得正则表达式的构建更加直观和易读。

官方资源

快速开始

安装

pubspec.yaml 文件中添加依赖:

dependencies:
  verbal_expressions: ^2.0.0

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

基本用法

构建和测试正则表达式

以下是一个简单的示例,用于匹配 URL:

import 'package:verbal_expressions/verbal_expressions.dart';

void main() {
  // 构建正则表达式
  var regex = VerbalExpression()
    ..startOfLine()
    ..then("http").maybe("s")
    ..then("://")
    ..maybe("www.")
    ..anythingBut(" ")
    ..endOfLine();

  // 创建一个示例 URL
  String url = "https://www.google.com";

  // 使用 VerbalExpression 的 hasMatch 方法测试字符串是否匹配正则表达式
  bool isMatch = regex.hasMatch(url); // true

  // 输出正则表达式
  print(regex.toString()); // ^http(s)?\:\/\/(www\.)?([^\\ ]*)$
}

多个条件匹配

以下示例展示了如何使用 or 方法来匹配多个条件:

import 'package:verbal_expressions/verbal_expressions.dart';

void main() {
  // 构建正则表达式
  var regex = VerbalExpression()
    ..startOfLine()
    ..then("abc")
    ..or("def");

  // 测试字符串
  String testString = "defzzz";

  // 使用 VerbalExpression 的 hasMatch 方法测试字符串是否匹配正则表达式
  bool isMatch = regex.hasMatch(testString); // true
}

预定义字符组

verbal_expressions 提供了一些预定义的字符组,方便快速构建正则表达式:

import 'package:verbal_expressions/verbal_expressions.dart';

void main() {
  // 构建正则表达式
  var regex = VerbalExpression()
    ..wordChar()
    ..nonWordChar()
    ..space()
    ..nonSpace()
    ..digit()
    ..nonDigit();

  // 输出正则表达式
  print(regex.toString()); // \w\W\s\S\d\D
}

捕获组

以下示例展示了如何定义捕获组并提取匹配结果:

import 'package:verbal_expressions/verbal_expressions.dart';

void main() {
  // 构建正则表达式
  var expression = VerbalExpression()
    ..find("a")
    ..beginCapture()
    ..find("b")
    ..anything()
    ..endCapture()
    ..then("cd");

  // 转换为 RegExp
  RegExp regex = expression.toRegExp();

  // 测试字符串
  String text = "abcd";

  // 获取匹配结果
  var match = regex.firstMatch(text);
  print(match.group(0)); // abcd
  print(match.group(1)); // b
}

更多示例

匹配电话号码

以下示例展示了如何匹配不同格式的电话号码:

import 'package:verbal_expressions/verbal_expressions.dart';

bool matchTelephoneNumber(String number) {
  final regex = VerbalExpression()
    ..startOfLine()
    ..then('+')
    ..beginCapture()
    ..range(['0', '9'])
    ..count(3)
    ..maybe('-')
    ..maybe(' ')
    ..endCapture()
    ..count(3)
    ..endOfLine();

  return regex.hasMatch(number);
}

void main() {
  const phoneWithSpace = '+097 234 243';
  print(matchTelephoneNumber(phoneWithSpace)); // true

  const phoneWithoutSpace = '+097234243';
  print(matchTelephoneNumber(phoneWithoutSpace)); // true

  const phoneWithDash = '+097-234-243';
  print(matchTelephoneNumber(phoneWithDash)); // true
}

提取域名

以下示例展示了如何从 URL 中提取域名:

import 'package:verbal_expressions/verbal_expressions.dart';

String getDomain(String url) {
  final expression = VerbalExpression()
    ..startOfLine()
    ..then('http')
    ..maybe('s')
    ..then('://')
    ..maybe('www.')
    ..anythingBut(' ')
    ..beginCapture()
    ..then('.')
    ..anythingBut('/')
    ..endCapture()
    ..anything()
    ..endOfLine();

  return expression.toRegExp().firstMatch(url)?.group(1) ?? '';
}

void main() {
  String domain = getDomain('https://www.google.com');
  print(domain); // .com

  domain = getDomain('http://ru.wikipedia.org/wiki/Dart');
  print(domain); // .org
}

替换文本

以下示例展示了如何使用 verbal_expressions 进行文本替换:

import 'package:verbal_expressions/verbal_expressions.dart';

void main() {
  final expression = VerbalExpression()
    ..find('dog')
    ..stopAtFirst()
    ..withAnyCase();

  final testString = expression.replace(
      'Replace first DoG in the sentence but do not touch second dog', 'cat');

  // Replace first cat in the sentence but do not touch second dog
  print(testString);
}

特性和问题

其他实现

verbal_expressions 在其他编程语言中的实现可以在这里找到:

更多实现可以在 VerbalExpressions.github.io 查看。


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

1 回复

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


当然,以下是一个关于如何在Flutter中使用verbal_expressions插件来构建和使用正则表达式的代码案例。verbal_expressions插件提供了一种更加直观和可读的方式来构建正则表达式,特别适合于那些对正则表达式语法不太熟悉的人。

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

dependencies:
  flutter:
    sdk: flutter
  verbal_expressions: ^0.4.0  # 请检查最新版本号

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

接下来是一个完整的Flutter应用示例,展示如何使用verbal_expressions插件来匹配一个简单的电子邮件地址格式:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Verbal Expressions Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final TextEditingController _controller = TextEditingController();
  String _result = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Verbal Expressions Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TextField(
              controller: _controller,
              decoration: InputDecoration(
                labelText: 'Enter email address',
              ),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () {
                _validateEmail();
              },
              child: Text('Validate Email'),
            ),
            SizedBox(height: 16),
            Text(
              _result,
              style: TextStyle(color: Colors.red),
            ),
          ],
        ),
      ),
    );
  }

  void _validateEmail() {
    // 使用verbal_expressions构建正则表达式
    VerbalExpression emailExp = VerbalExpression()
      .startOfLine()
      .then("[^@\\s]+")
      .then("@")
      .then("[^@\\s]+\\.[^@\\s]+")
      .endOfLine();

    bool isValid = emailExp.test(_controller.text);

    setState(() {
      _result = isValid ? 'Valid email address' : 'Invalid email address';
    });
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个文本输入框和一个按钮。用户可以输入一个电子邮件地址,并点击按钮来验证该地址是否符合基本的电子邮件格式。

我们使用VerbalExpression类来构建正则表达式,这里构建的正则表达式匹配一个基本的电子邮件地址格式:

  • 以非空白和非@字符开始
  • 接着是一个@符号
  • 然后是非空白和非@字符,后面跟着一个点,再后面是非空白和非@字符
  • 以行尾结束

_validateEmail方法使用emailExp.test(_controller.text)来检查用户输入的文本是否符合这个正则表达式。根据验证结果,我们更新_result字符串,并在UI上显示相应的消息。

这个示例展示了如何使用verbal_expressions插件来以一种更加可读和直观的方式构建和使用正则表达式。

回到顶部