我在dart中构建日志解析器。如何使用dart正则表达式库来检索匹配值。
使用此link检查我的正则表达式,一切正常,具体如下:
(?<suffix>^.*m)(?<time>\d{1,2}:\d{1,2}:\d{1,2},\d{1,3}) (?<level>[^\s]+) (?<message>.*)
输入这些值将为您提供:后缀,时间,级别和消息
我无法将我的正则表达式与dart库一起使用。
答案 0 :(得分:2)
您不能像在Dart中那样在类似JS的正则表达式中使用命名组。
使用编号的捕获组并通过其索引访问它们:
RegExp regExp = new RegExp(r"^(.*m)(\d{1,2}:\d{1,2}:\d{1,2},\d{1,3}) ([^\s]+) (.*)");
请参阅此regex demo
在Dart中,尝试这样的事情:
RegExp regExp = new RegExp(r"^(.*m)(\d{1,2}:\d{1,2}:\d{1,2},\d{1,3}) ([^\s]+) (.*)");
String s = "[0m[31m22:25:57,366 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-8) MSC000001: Failed to start service jboss.deployment.unit.\"bad.war\"";
Iterable<Match> matches = regExp.allMatches(s);
for (Match match in matches) {
print("${match.group(1)}\n");
print("${match.group(2)}\n");
print("${match.group(3)}\n");
print("${match.group(4)}\n");
}
请参阅此DartPad demo
答案 1 :(得分:0)
对于未来的读者来说,正如Scott Hyndman在评论中解释的那样,RegExpMatch现在支持此功能。 https://api.dartlang.org/stable/2.4.0/dart-core/RegExp-class.html
这似乎确实现在在DartPad中有效(至少在dart 2.4.0中有效)。 https://dartpad.dartlang.org/de5fafc572ebb786c9b4791229c65a9b