正则表达式详解
作者:互联网
正则表达式学习过程中最容易产生的误会
如果匹配成功则返回匹配成功的字符串,这个匹配成功的字符串很多人认为是整个存在目标值的整个字符串
如,abcd中我匹配abc,则返回结果为abcd
错,大错特错,结果其实就是目标值。
记住一句话,匹配什么,就返回什么。或者目标值是什么,就返回什么。
常用字符
空字符
字符 | 含义 |
---|---|
\n | 换行,line feed, 使光标下移一格 |
\r | 回车,carriage return, 使光标移动到行首 ※ windows下的换行: \r\n,Linux和Mac的换行: \n |
\x85 | 下一行 next line |
\u2028 | 行分隔符 |
\u2029 | 段落分隔符 ※ \u****是十六进制的表达方式,也是Unicode编码 |
元字符
普通字符
字符 | 含义 | 等价 |
---|---|---|
. | 匹配除 \n \r 以外的所有字符 | [^\r\n\x85\u2028\u2029] \x85 \u2028 \u2029 见空字符 |
\w | 匹配字母,数字,下划线以及汉字等其它自然语言文字(java中不能匹配汉字) | [0-9A-Za-z_] |
\s | 匹配空白字符 | [\t\n\v\f\r ] 注:最后一个字符' ' |
\d | 匹配数字 | [0-9] |
反义字符
字符 | 含义 | 等价 |
---|---|---|
\W | 与 \w 相反 | [^\w] [^0-9A-Za-z_] |
\S | 与 \s 相反 | [^\s] [^\t\n\v\f\r ] |
\D | 与 \d 相反 | [^0-9] |
[^abc] | 匹配 abc 以外的所有字符 | 无 |
定位符
字符 | 含义 |
---|---|
^ | 匹配文本的开头(匹配所有字符,包括空白符) 如果设置了 RegExp 对象的 Multiline 属性,也匹配 \n 或 \r 之后的位置 |
$ | 匹配文本的结尾(同上) 如果设置了 RegExp 对象的 Multiline 属性,也匹配 \n 或 \r 之前的位置 |
\b | 单词边界匹配,匹配单词的开头或结尾(与^ $相同只有边界作用) ※ 与 ^ $ 不同 \b 只匹配字母、数字、汉字、下划线 |
\B | 非单词边界匹配,同样是匹配单词的开头和结尾 |
鉴于 \b 和 \B 比较难理解,举几个例子说明下
注:[xxx]表示匹配到的字符
// 例一
/\babc/
注:匹配单词开头的abc,如 [abc]e
// 例二
/abc\b/
注:匹配单词结尾的abc,如 d[abc]
// 例三
/\Babc/
注:匹配除开头abc以外的abc,如 e[abc][abc][abc]
// 例四
/abc\B/
注:匹配除结尾abc以外的abc,如 [abc][abc][abc]e
※ 例子中的 /xxxxxx/ 这样的写法不是所有语言或者环境都支持的,使用前请查证,如 xxxxxx 这样的形式也是很常见的
重复限定符
限定字符出现的次数
字符 | 含义 |
---|---|
* | [0, 正无穷] |
+ | [1, 正无穷] |
? | [0, 1] |
{n} | [n, n] |
{n,} | [n, 正无穷] |
{n, m} | [n, m] |
非打印字符
字符 | 含义 | 等价 |
---|---|---|
\cx | 匹配由x指明的控制字符。例如,\cM 匹配一个 Control-M 或 回车符。 x的值必须为 A-Z 或 a-z。否则,将视为'c'x两个字符的单纯组合 |
无 |
\f | 匹配一个换页符 | \x0c \cL |
\n | 匹配一个换行符。 | \x0a \cJ |
\r | 匹配一个回车符 | \x0d \cM |
\t | 匹配一个制表符 | \x09 \cI |
\v | 匹配一个垂直制表符 | \x0b \cK |
\s | 见普通字符 | 同左 |
\S | 见反义字符 | 同左 |
其它
字符 | 含义 |
---|---|
\num | 返回第 num 个捕获组的值 |
分组
可以使用()分组,以方便对应分组的返回值可以复用
^((ab))*
命名分组:
(?<组名>pattern)
捕获分组
非捕获分组
(?:pattern):不能使用编号获取
(?=pattern):匹配有指定内容的指定字符串
// 测试文本
韩顺平教育
韩顺平老师
韩顺平同学
// 韩顺平(教育|老师|同学) 匹配符合组内容的文本,且匹配结果包括组中内容,并捕获组内容
韩顺平教育 教育
韩顺平老师 老师
韩顺平同学 同学
// 韩顺平(?:教育|老师|同学) 匹配符合组内容的文本,且匹配结果包括组中内容,但不捕获组内容
韩顺平教育
韩顺平老师
韩顺平同学
// 韩顺平(?=教育|老师|同学) 匹配符合组内容的文本,但匹配结果不包括组中内容,且不捕获组内容
韩顺平
韩顺平
韩顺平
// 韩顺平(?!教育|老师|同学) 匹配不符合组内容的文本,但匹配结果不包含组中内容的补集,且不捕获组内容
无
※ 当前的组中内容的补集:教育,老师,同学以外的字符串,换而言之,只要不是这三个字符串就符合
引出问题:为什么要有非捕获分组,捕获会消耗性能吗,还是因为别的原因
选择匹配符
和或运算符差不多,表示括号用的130,131,132,155中出现一个就可以
^(130|131|132|155)
转义
略
区间
废话不多说,如下文
[0-9] [a-z] [A-Z] [abc]
非贪婪匹配
??
+?
*?
{n,m}?
反向引用
内部(正则表达式内)用\num,外部(正则表达式外部)用$num
标签:字符,abc,匹配,正则表达式,捕获,详解,内容,顺平 来源: https://www.cnblogs.com/buzuweiqi/p/16491645.html