Dart学习笔记(15):正则表达式中的Match和Group

发表于2018-07-04 18:01 阅读(34)

很久没有更新Dart的内容了
这里说一下正则表达式

本文地址:http://www.cndartlang.com/765.html

在我们处理纯文本的时候
正则表达式相比自己写分析器来说
功能十分强大,不容忽视

但是,也必须正则表达式良好的书写习惯
像 .* 这种贪婪匹配很容易造成大量的回溯
引起性能的严重下降
而且结果可能和你预想的可能并不一样
在下一篇文章中会提及

这里我安装的Dart SDK版本是1.15.0
作为核心库的一部分,RegExp的接口改变并不大

下面代码的作用是提取字符串
也可以说是分割

void main() {
  String str = "1A 2B 11Q 12J #004488";
  
  //字符串前加字母"r",字符串不会解析转义""
  RegExp reg = new RegExp(r"((\d)+)([A-Z])");
  
  //调用allMatches函数,对字符串应用正则表达式
  //返回包含所有匹配的迭代器
  Iterable<Match> matches = reg.allMatches(str);

  for (Match m in matches) {
    //groupCount返回正则表达式的分组数
    //由于group(0)保存了匹配信息,因此字符串的总长度为:分组数+1
    for(int i=0; i<m.groupCount+1; i++) {
      String match = m.group(i);
      print("Group[$i]: $match");
    }
    print("\n");
  }
}

运行结果:

Group[0]: 1A
Group[1]: 1
Group[2]: 1
Group[3]: A

Group[0]: 2B
Group[1]: 2
Group[2]: 2
Group[3]: B

Group[0]: 11Q
Group[1]: 11
Group[2]: 1
Group[3]: Q

Group[0]: 12J
Group[1]: 12
Group[2]: 2
Group[3]: J

通过对上面的代码和运行结果分析,可以知道
RegExp对象是正则表达式的编译表现形式
Match对象包含了字符串的匹配结果
并且,调用group函数可以返回每个分组信息

在 ((\d)+)([A-Z]) 这个正则表达式中
总共包含了4个分组,其中group(0)代表了整个分组
从id=1开始,则是子分组,示意图如下:

简单一点说,可以从左到右通过左括号来判断id
第一个左括号 ( 就是分组1,第二个是分组2
以此类推、、、

在这个例子中,需要说明的是 (\d)+ 这个表达式
在贪婪模式中,此分组只捕获最后一次匹配
比如字符串12345,只能匹配最后一个字符5

RegExp的使用很简单
重点还是正则表达式的内容
接下来的帖子有几个例子,可以参考一下