Flutter正则表达式处理插件fancy_regex的使用
Flutter正则表达式处理插件fancy_regex的使用
功能特性
如果你在编写正则表达式时遇到困难,或者不习惯使用内置的RegExp
类,那么你可以开始学习如何使用这个包来实现正则表达式。
该包提供了API,使你能够通过更详细但更易读的类和方法来编写正则表达式。如果你已经非常擅长编写正则表达式,那么你可能不需要这个包。
开始使用
首先,在你的pubspec.yaml
文件中添加依赖项:
dependencies:
fancy_regex: ^0.1.0
然后导入该包:
import 'package:fancy_regex/fancy_regex.dart';
基本用法
你可以使用两种不同的方式来创建正则表达式对象。
- 建造者模式:实例化一个基础的
RegExpComponent
表达式,然后可以通过提供的扩展方法进行扩展。 - 类似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
更多关于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.
}