1、前言

API中对于正则表达式的注释是:
正则表达式的规范和语义与JavaScript相同
详细的规范可以参考:http://ecma-international.org/ecma-262/5.1/#sec-15.1

打开链接,全英文的、、、瞄了一下
不明觉厉!!!

然后,花了一段时间对其支持的特性进行了测试
在附表中将Dart中正则表达式的特性列出来,简单明了
以供大家参考

2、点号通配符

关于Dart中正则表达式支持的特性
越是深入了解,越是感觉复杂

附表中的内容可能不全,但基本上都有提及
这里需要注意其中的 . 点号通配符

通常,点号是不能匹配换行符的
这也使得 .* 表达式变得有些古怪
由于最初Unix正则表达式都是逐行处理的
所以可能后来新的语法是为了保证一致性吧!

但是在测试的时候,结果让人有点头大
例如,处理字符串 ABC\nDEF

import 'dart:io';

void main() {
String str = "ABC\nDEF";
RegExp reg = new RegExp(r".*");
Iterable<Match> matches = reg.allMatches(str); for (Match m in matches) {
print("${m.group(0).isEmpty ?
"Match is Empty\nIndex is ${m.end}" :
"Match is ${m.group(0)} \nAscii is ${m.group(0).codeUnits}\nIndex is ${m.end}"}");
print("--end--\n");
}
}

运行结果:

Match is ABC
Ascii is [65, 66, 67]
Index is 3
--end-- Match is Empty
Index is 3
--end-- Match is DEF
Ascii is [68, 69, 70]
Index is 7
--end-- Match is Empty
Index is 7
--end--

通过分析,对于正则表达式 .*
共匹配有4个Match
分别是:ABC 空 DEF 空
匹配到字符串的 \n 的时候结束
这里 \n 并没有被捕获,而是捕获位置
是不是有点像 $

那么我们来匹配一下 .*$
运行结果:

Match is DEF
Ascii is [68, 69, 70]
Index is 7
--end-- Match is Empty
Index is 7
--end--

什么意思呢?
在匹配 .* 的时候,如果遇到 \n
处理方式和遇到 $ 一样,停止“本行”匹配
但是不捕获文本、、、有点绕

如果我们打开RegExp的multiLine开关,结果会怎么样?
大家可以动手测试一下

new RegExp(".*", multiLine:true);

对于 .* 表达式,结果没有任何变化
但是对于 .*$ ,结果此时和 .* 的结果一样
也就是说,在打开multiLine开关的时候
如果表达式 .* 遇到 \n ,处理方式和遇到 $ 一样
同时匹配之前的字符串、、、

如果我们想捕获 \n 这个字符串的话,有办法吗?
在测试过后,得出结论
无论是否打开multiLine, .* 都不会匹配 \n 本身
但是,无论是否打开multiLine
[] 字符组和 [^] 排除型字符组都会匹配 \n 本身

可以试一下匹配 [^!]* ,运行结果如下:

Match is ABC
DEF
Ascii is [65, 66, 67, 10, 68, 69, 70]
Index is 7
--end-- Match is Empty
Index is 7
--end--

\n 的Ascii码是10,结果没有问题
\n 作为文本被捕获,字符串结束的位置也被捕获

如果说的不够清楚,大家可以打开、关闭multiLine开关的情况下
分别测试如下表达式: ^.* 、 .*$ 、 ^.*$ ,然后体会一番

点号通配模式,也有个称呼叫单行模式
在匹配多行文本的时候,需要特别注意
对最终结果还是影响很大的、、、

3、附表:Dart中正则表达式支持的特性

特性
描述
\
将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。例如,”n”匹配字符”n”。”\n”匹配一个换行符。序列”\\”匹配”\”,”\(“则匹配”(“。
.
匹配任何单个字符。
^
匹配输入字符串的开始位置。如果设置了RegExp 对象的Multiline属性,^也匹配”\n”或”\r”之后的位置。例如,”^.”可以匹配”abc\n123″中的”a”和”1″。
$
匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配 “\n” 或”\r”之前的位置。例如,”.$”可以匹配”abc\n123″中的”c”和”3″。
*
匹配前面的子表达式零次或多次。例如,”zo*”能匹配 “z”或”zoo”整个字符串。”*”等价于{0,}。
+
匹配前面的子表达式一次或多次。例如,”zo+” 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。”+”等价于{1,}。
? (限制符)
匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does”整个字符串。”?”等价于 {0,1}。
?(非贪婪模式)
当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串”oooo”,”o+?”将匹配单个”o”,而”o+”将匹配”oooo”。
x|y
匹配x或y。例如,”z|food”能匹配”z”或”food”。”(z|f)ood” 则匹配”zood”或”food”。
[xyz]
字符集合。匹配所包含的任意一个字符。例如,”[abc]” 可以匹配”plain”中的”a”。Dart中不支持字符组嵌套,如:[[a-z]&&[^b]]。
[^xyz]
排除字符集合。匹配未包含的任意字符。例如, “[^abc]” 可以匹配 “plain” 中的”p”。
[a-z]
字符范围。匹配指定范围内的任意字符。例如,”[a-z]”可以匹配”a”到”z”范围内的任意小写字母字符。
[^a-z]
排除字符范围。匹配任何不在指定范围内的任意字符。例如,”[^a-z]”可以匹配任何不在”a”到”z”范围内的任意字符。
{n}
n 是一个非负整数。匹配确定的n次。例如,”o{2}”不能匹配”Bob”中的”o”,但是能匹配”food”中的”oo”。
{n,}
n 是一个非负整数。至少匹配n 次。例如,”o{2,}”不能匹配”Bob”中的”o”,但能匹配”fooood”中的”oooo”。”o{1,}”等价于”o+”。”o{0,}”则等价于”o*”。
{n,m}
m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。刘, “o{1,3}” 将匹配 “fooood” 中的”ooo”和”o”。”o{0,1}”等价于”o?”。请注意在逗号和两个数之间不能有空格。
(pattern)
匹配pattern 并获取这一匹配。此时,整个表达式无论多复杂,都被视为一个单元。所获取的匹配可以从产生的 Match对象的group(id) 得到。要匹配圆括号字符,请使用 ‘\(‘ 或 ‘\)’。
(?:pattern)
非匹配型括号。相比普通括号,非匹配型括号只分组不捕获。这样一是可以避免不必要的捕获,提高效率,二是可以让代码可以更加清晰[例如,在捕获字符串中某个名字的时候,可能是group(1)或2、3…使用非匹配型括号,可以仅返回group(1)]。
(?=pattern)
肯定顺序环视。环视匹配的是特定位置,不匹配任何字符,也就是并不会“占用”字符。顺序环视从左到右匹配表达式,如果能匹配,则返回匹配成功信息。
(?!pattern)
否定顺序环视。从左到右匹配表达式,如果不能匹配,则返回匹配成功信息。
(?<=pattern)
肯定逆序环视,不支持。
(?<!pattern)
否定逆序环视,不支持。
(?>pattern)
固化分组,不支持。
(?if then |else)
条件判断,不支持。
(?<name>pattern)
捕获文本到命名组,不支持。
(?#text)
注释,不支持。
\w
匹配包括下划线的任何单词字符。等价于”[A-Za-z0-9_]”。
\W
匹配任何非单词字符。等价于”[^A-Za-z0-9_]”。
\b
匹配单词(\w+)的边界(开始或末尾)。例如,对于字符串”never??!!”,”er\b”可以匹配”er”,”\bne”可以匹配”ne”。
\B
匹配单词(\w+)的非末尾,对于非单词(\W、\W+)字符没有意义。例如,对于字符串”never??!!”,表达式”ev\B”能匹配”ev”;表达式”\?\B”能匹配两个”?”,”\?!\B”能匹配”?!”,此时\B没有意义。
\cx
匹配由x指明的控制字符。例如,\cM匹配Control+M,等价于\r,\cI匹配\t,\cJ匹配\n,。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的”c”字符。
\d
匹配一个数字字符。等价于 [0-9]。
\D
匹配一个非数字字符。等价于 [^0-9]。
\f
匹配一个换页符。等价于 \x0c 和 \cL。
\n
匹配一个换行符。等价于 \x0a 和 \cJ。
\r
匹配一个回车符。等价于 \x0d 和 \cM。
\s
匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
\S
匹配任何非空白字符。等价于[^ \f\n\r\t\v]。
\t
匹配一个制表符。等价于 \x09 和 \cI。
\v
匹配一个垂直制表符。等价于 \x0b 和 \cK。
\<
匹配单词开始位置,不支持。
\>
匹配单词结束位置,不支持。
\xn
匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,”\x41″匹配”A”。正则表达式中可以使用ASCII 编码。
\int
反向引用,int为一个正整数。匹配之前获取的、表达式匹配的文本。例如:”(a)(b)(c)\1\2\3″能够匹配”abcabc”。“\”元字符中,优先级为:反向引用>八进制Ascii值>原义字符。
\oct
标识一个八进制转义值或一个反向引用。如果之前至少 有otc个获取的子表达式,则otc为后向引用。否则,如果otc为八进制数字 (0-7),则otc为一个八进制转义值(具体查看ASCII 编码)。
\nm
标识一个八进制转义值或一个反向引用。如果 \nm 之前至少有nm个获取得子表达式,则nm为反向引用。如果 \nm之前至少有n个获取,则n为一个后跟文字m的反向引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm(具体查看ASCII 编码)。
\nml
如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml(具体查看ASCII 编码)。例如,”\101″能够匹配”A”。
\un
匹配n,其中n是一个用四个十六进制数字表示的 Unicode字符。例如,”\u00A9″匹配版权符号”©”。
[:flag:]
字符簇,如alnum、alpha、digit等,不支持。
\p{flag}
Unicode属性、字母表和区块,如InHanzi、Letter、Number等,不支持。
g、s、i、m、x、U
修饰符,用在正则表达式结尾,不支持。
区分大小写
设置RegExp中可选参数为caseSensitive。
多行匹配
当匹配的字符串是多行的时候,可设置RegExp可选参数multiLine。

dart正则的更多相关文章

  1. Dart和JavaScript对比小结

    作为一名web前端来入门dart,新语言和我们熟悉的js有所差异,写dart的过程中容易受到原有思维的影响,这里把dart和js做一个对比总结,方便查找和熟悉. 变量声明 var 关键字 dart和j ...

  2. Javascript正则对象方法与字符串正则方法总结

    正则对象 var reg = new Regexp('abc','gi') var reg = /abc/ig 正则方法 test方法(测试某个字符串是否匹配) var str = 'abc123'; ...

  3. C#-正则,常用几种数据解析-端午快乐

    在等待几个小时就是端午节了,这里预祝各位节日快乐. 这里分享的是几个在C#中常用的正则解析数据写法,其实就是Regex类,至于正则的匹配格式,请仔细阅读正则的api文档,此处不具体说明,谢谢. 开始吧 ...

  4. Javascript 中 with 的替代方案和String 中的正则方法

    这几天在升级自己的MVVM 框架,遇到很多小问题,就在这里统一解决了. with 语法 在代码中,要执行这么一个函数 function computeExpression(exp, scope) { ...

  5. JavaScript与PHP中正则

    一.JavaScript 有个在线调试正则的工具,点击查看工具.下面的所有示例代码,都可以在codepen上查看到. 1.创建正则表达式 var re = /ab+c/; //方式一 正则表达式字面量 ...

  6. Java正则速成秘籍(一)之招式篇

    导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...

  7. Java正则速成秘籍(二)之心法篇

    导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...

  8. Java正则速成秘籍(三)之见招拆招篇

    导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...

  9. python浅谈正则的常用方法

    python浅谈正则的常用方法覆盖范围70%以上 上一次很多朋友写文字屏蔽说到要用正则表达,其实不是我不想用(我正则用得不是很多,看过我之前爬虫的都知道,我直接用BeautifulSoup的网页标签去 ...

随机推荐

  1. 用于文本分类的多层注意力模型(Hierachical Attention Nerworks)

    论文来源:Hierarchical Attention Networks for Document Classification 1.概述 文本分类时NLP应用中最基本的任务,从之前的机器学习到现在基 ...

  2. Nginx缓存服务

    Nginx缓存服务 1.缓存常见类型 2.缓存配置语法 3.缓存配置实践 4.缓存清理实践 5.部分页面不缓存 6.缓存日志记录统计 通常情况下缓存是用来减少后端压力, 将压力尽可能的往前推, 减少后 ...

  3. VsCode云端版本

    VsCode的云端版与客户端简直是一模一样. 官网地址为:https://coder.com/ 安装命令: docker run -t -p 127.0.0.1:8443:8443 -v " ...

  4. Flask 框架 debug=Ture 和Json解码:

    Flask框架常用配置文件: 以下推荐四种方法: (一):创建一个配置类. (二):正常代码配置文件. 接下下来两种方法需要新建文件: 步骤为: 1:在当前目录下新建一个文件,名字为:config.i ...

  5. 《HTTP协议:菜鸟入门系列》

    很多测试人员在有了一定的测试经验(一般是1-2年)后,就会陷入瓶颈阶段,想提升,但不知道如何提升,学习又没有比较明确的方向,曾经我也是... 那么,我建议系统的学习一下HTTP协议,好处很多:对接口测 ...

  6. mysql 性能优化思路 - mysqldumpslow /tmp/mysql-slow.log 字符集 utf-8 create database

    提高MySQL服务的性能,响应速度: 1.替换有问题的硬件:内存,CPU,磁盘 2.服务的配置参数的配置 3.SQL的优化 .服务参数的配置: 1.1 连接数,连接超时: max_connection ...

  7. java 基础 instance of

    a instance of b   a是否是b类的实例对象 返回 bool值

  8. 给大家推荐8个SpringBoot精选项目

    前言 2017年,曾在自己的博客中写下这样一段话:有一种力量无人能抵挡,它永不言败生来倔强.有一种理想照亮了迷茫,在那写满荣耀的地方. 如今2018年已过大半,虽然没有大理想抱负,但是却有自己的小计划 ...

  9. [翻译] C# 8.0 新特性

    原文: Building C# 8.0 [译注:原文主标题如此,但内容大部分为新特性介绍,所以意译标题为 "C# 8.0 新特性"] C# 的下一个主要版本是 8.0.我们已经为它 ...

  10. javascript状态机及在工作流中的应用

    #javascript状态机及在工作流中的应用 ##状态机 什么叫状态机(Finite State Machine),书面上的解释可以自己借助搜索引擎寻找到.通俗地来讲是一个状态定义.查找.切换和事件 ...