1.正则表达式用途
2.基础
2.1 单元
单字符
- 普通字符,例如a、b、c;
- 字符集,写法为[ctx],例如[abc]、[a-z];
- 取反字符集,写法为[^ctx],例如[^{}]表示大括号的字符集;
- 简写集,写法为\ctx,例如\w表示字母数字下划线集合;
- 特殊符号,写法为\ctx,例如\.表示字符.,\t表示制表符;
- POSIX字符类,写法为[:name:],和简写集部分重叠,
例如[:alpha:]表示字母集。
关于POSIX字符类有一点要注意,需要写成[[:alpha:]],而不是[:alpha:];
简写集和特殊符号表如下:
POSIX字符类表如下:
字符串、子表达式、或操作
- 字符串,例如strabc;
- 子表达式,写法为(regular),例如([abc]*);
- 或操作,写法为u1 | u2 | u3,例如(a | [cba] | [abc]*)。
功能上而言,我觉得就是广义的“字符集”,可以自定义出基于字符、字符串、子表达式的单元集合,而不仅仅局限于字符;
2.2 重复次数
固定重复次数
- 0到N次,写法为ctx*,例如[abc]*;
- 1到N次,写法为ctx+,例如[abc]+;
- 0到1次,写法为ctx?,例如[abc]?;
范围重复次数
- m到n次,写法为ctx{m,n},例如[abc]{1,10};
- m到N次,写法为ctx{m,},例如[abc]{m,};
- m次,写法为ctx{m},例如[abc]{m};
3.其他特性
3.1 贪婪匹配和懒惰匹配
正则表达式默认采用贪婪匹配,例如
.*at => The fat cat sat on the mat => 整个字符串被匹配
可能的结束点’fat‘、‘cat’、'sat’被忽略了,知道’mat’才结束匹配。如果说高级语言的if else匹配是就近原则,这里可以说是就远原则,这就是所谓贪婪匹配。
可以调整为就近原则,也就是懒惰匹配:
.*?at => The fat cat sat on the mat => The fat被匹配
3.2 边界问题
字符串界定
正则表达式查找的范围为“字符串”,默认是全部内容算作一个“字符串”,而不是常规的以换行符\n来界定一个字符串。
可以开启多行模式来转换成常规的\n界定字符串的情况。
字符串开头结尾匹配检验
- 字符串开头检验,写法为^ctx,
例子为检验xml文件开头的合法性,
正则表达式:^\s*(<?xml.*?>
invaild
<?xml version = "1.0" encoding = "UTF-8" ?>
如上的xml文件将判定为不合法;
- 字符串结尾检验,写法为ctx$,
例子为检验html文件结尾合法性,
正则表达式:</[Hh][Tt][Mm][Ll]>\s*$
<html/> invaild
如上的html文件将判定为不合法;
待续…