regex - 如何在 Dart 中组合两种模式?
问题描述
在 Dart中,Pattern
如文档中所述,a 是“字符串中基本搜索的接口”。
我想像这样组合两个Pattern
s:
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
s 中使用。那么,实现这一目标最合理的方法是什么?
解决方案
但是
$
注入变量的语法不能在Pattern
s 中使用。
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);
最后,我不得不指出,当前有效的 Dart 风格建议是不要对常量使用全大写。
推荐阅读
- spring - 使用“*”通配符的 Spring CORS 映射不起作用
- wso2 - 在 wso2 ei 我得到 org.apache.axiom.om.OMException: javax.xml.stream.XMLStreamException: DOCTYPE is not allowed 异常
- javascript - S3 预签名 URL 问题 - 文件上传成功,200 statusCode 但没有响应正文
- python - 将一个表中的数据字段移动到另一个表
- android - 更新 Room 数据库时未触发 LiveData
- twitter-bootstrap - 带有 Bootstrap-Vue 的 textarea 中的多行占位符
- phoenix-framework - Elixir Phoenix 中电子邮件模板中的验证链接
- firefox - 在文本区域/文本输入中的 Firefox 上禁用快速查找(仅限链接)
- clion - 用于 C 编程的 CLion "if" 实时模板大括号
- objective-c - 在 Swift 协议中使用 ObjC 块