其他分享
首页 > 其他分享> > 正则表达式详解

正则表达式详解

作者:互联网

正则表达式学习过程中最容易产生的误会

如果匹配成功则返回匹配成功的字符串,这个匹配成功的字符串很多人认为是整个存在目标值的整个字符串

如,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