Dart RegExp未返回匹配项

时间:2019-01-12 09:06:21

标签: dart

我有一个经过测试的正则表达式,可以将created分隔的字符串分割成字符串,除非,放在方括号中。

https://regex101.com/r/COMj2b/1中以ECMAScript风格在此字符串中测试正则表达式会得到所需的匹配。我的Dart版本没有打印任何匹配项。

非常感谢任何指导!

,

我的Dart代码打印void main() { String s = """Joe's Jazz Band (Ensemble), Fred Dagg (Guitar), Tommy Tucker (Horn, Clarinet), The Pied Piper (Whistle)"""; RegExp re = RegExp(r'([^,(]*\([^)]*\))*[^,]*(,|$)'); List li = s.split(re); print('$li'); }

我希望它能打印: [,,,]

2 个答案:

答案 0 :(得分:1)

split不返回匹配项,而是在模式匹配项处拆分字符串,并返回子字符串列表。

假设分隔符是一个)括号,后跟零个或多个空格和一个逗号,则可用于split:

void main() {
  String s = """Joe's Jazz Band (Ensemble), Fred Dagg (Guitar), Tommy Tucker (Horn, Clarinet), The Pied Piper (Whistle)""";
  RegExp re = RegExp(r'\)[ \t]*,');

  Iterable li = s.split(re).map((item) => item.endsWith(")") ? item.trim() : "$item)".trim());

  li.forEach((item) => print('$item'));

}

请注意,有必要在最后分割的元素上添加)。 如果要删除开头和结尾的空格,则trim()并不是必需的。

答案 1 :(得分:0)

如前所述,@ attdona split不返回匹配项,因此,如果要获取匹配项,请使用类似的内容:

void main() {
  String s = """Joe's Jazz Band (Ensemble), Fred Dagg (Guitar), Tommy Tucker (Horn, Clarinet), The Pied Piper (Whistle)""";
  RegExp re = RegExp(r'([^,(]*\([^)]*\))*[^,]*(,|$)');

  List l = re.allMatches(s).toList();
  List<String> li = new List();
  for(Match e in l) {
    li.add(e.group(0));
  }

  print('$li');
}