如何在 Dart 中组合两种模式?

问题描述

在 Dart 中,Pattern 是“字符串中基本搜索的接口”,正如文档中所说。

我想像这样组合两个 Pattern

const Pattern REGEX_DATETIME_WITHOUT_TIMEZONE = r'\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.(\d{3}|\d{6}))?';
const Pattern REGEX_DATETIME_WITH_TIMEZONE = r'$REGEX_DATETIME_WITHOUT_TIMEZONE[+-]\d{2}:\d{2}';

但是 $ 注入变量的语法不能在 Pattern 中使用。那么,实现这一目标最合理的方法是什么?

解决方法

但是在 $ 中不能使用用于注入变量的 Pattern 语法。

PatternStringRegExp 的抽象基类。您拥有的是两个 String 文字,用于初始化两个静态类型为 Pattern 的变量。它们的实际类型仍然是 String

阻止您使用 $ 进行字符串插值的原因是您使用的是原始字符串(由字符串文字的 r 前缀表示),这本质上是从字面上处理所有字符(除了结束引号)。

你可以使用普通的字符串连接来组合你的字符串:

const String REGEX_DATETIME_WITHOUT_TIMEZONE = r'\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.(\d{3}|\d{6}))?';
const String REGEX_DATETIME_WITH_TIMEZONE = REGEX_DATETIME_WITHOUT_TIMEZONE + r'[+-]\d{2}:\d{2}';

如果串联很麻烦并且您确实需要插值,那么您可以将原始字符串存储在中间变量中,然后使用插值来组合它们:

const String REGEX_TIMEZONE = r'[+-]\d{2}:\d{2}';
const String REGEX_DATETIME_WITH_TIMEZONE = '$REGEX_DATETIME_WITHOUT_TIMEZONE$REGEX_TIMEZONE';

想必您以后想从它们构造实际的 RegExp 对象:

final regExpWithoutTimeZone = RegExp(REGEX_DATETIME_WITHOUT_TIMEZONE);
final regExpWithTimeZone = RegExp(REGEX_DATETIME_WITH_TIMEZONE);

最后,我不得不指出当前 Effective Dart 风格的建议是 not use all-caps for constants