正则表达式使用Dart lang

时间:2016-08-08 21:13:55

标签: regex dart dart-pub

我在dart中构建日志解析器。如何使用dart正则表达式库来检索匹配值。

使用此link检查我的正则表达式,一切正常,具体如下:

  • 正则表达式:(?<suffix>^.*m)(?<time>\d{1,2}:\d{1,2}:\d{1,2},\d{1,3}) (?<level>[^\s]+) (?<message>.*)
  • 输入:[0m [31m22:25:57,366 ERROR [org.jboss.msc.service.fail](MSC服务主题1-8)MSC000001:无法启动服务jboss.deployment.unit。&#34; bad的.war&#34;

输入这些值将为您提供:后缀,时间,级别和消息

我无法将我的正则表达式与dart库一起使用。

2 个答案:

答案 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