问题描述
在 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
语法。
Pattern
是 String
和 RegExp
的抽象基类。您拥有的是两个 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。