首页 > 解决方案 > 如何在 Dart 中组合两种模式?

问题描述

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

我想像这样组合两个Patterns:

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}';

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

标签: regexdatetimedartconcatenationiso

解决方案


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

Pattern是 和 的抽象基StringRegExp。你所拥有的是两个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);

最后,我不得不指出,当前有效的 Dart 风格建议是不要对常量使用全大写


推荐阅读