正则表达式
2019-08-26 10:33:35 0 举报
AI智能生成
正则表达式
作者其他创作
大纲/内容
用途
1.可以用来搜索字段
2.可以用来做替换
3.校验
定义:用来匹配和处理文本的字符串
字符集合
[ ]
匹配中括号中的任意一个字符
取非匹配
[^ ]
不匹配中括号中的所有字符
元字符
a-z A-Z 0-9
\s
任何一个空白字符
\S
任何一个非空白字符
.
匹配\n之外的所有字符
\f
换页符
\t
制表符
\b
退格符
\n
换行符
\r
回车符
\v
垂直制表符
\d
匹配数字
\D
匹配非数字
\w
匹配数字字母和下划线
\W
不匹配数字字母和下划线
\x
16进制字符
\0
八进制字符
重复匹配
?
匹配0次或1次
*
匹配0次或n次
+
至少匹配1次
{n,m}
匹配n次或m次
{n}
匹配n次
{n,}
至少匹配n次
防止过度匹配
*?
+?
{n,}?
例子
字符串:<A></A>sjsjksk<A></A>
表达式:<A>.*</A>
结果:<A></A>sjsjksk<A></A>
表达式:<A>.*</A>
结果:<A></A>sjsjksk<A></A>
字符串:<A></A>sjsjksk<A></A>
表达式:<A>.*?</A>
表达式:<A>.*?</A>
- 结果:<A></A>
<A></A>
可以防止过度匹配
位置匹配
单词匹配
\b
匹配这样一个位置,这个位置位于一个能够用来构成单词字符和一个不能用来构成的单词字符之间
不匹配单词边界
\B
匹配一个前后都不能构成单词字符的位置
定义字符串开头的
^
定义字符串结尾的
$
分行匹配
(?m)
会把\n当作一个文本的开始和结束。常常会和^和$一起使用
例如
字符串:ssts\nssts
表达式:^s.*s$
结果:匹配不到,因为.不匹配\n
表达式:(?m)^s.*s$
结果:true
表达式:^s.*s$
结果:匹配不到,因为.不匹配\n
表达式:(?m)^s.*s$
结果:true
子表达式
当需要匹配的是一个整体时使用子表达式
( 19|20)
表示匹配19或者20
回溯引用
如果后面的匹配模式与前面的匹配时有关联的,则使用回溯引用,就像一个变量
例如:
<H1>dfs</H1>
<H2>dsd</H3>
表达式:<H([1-6])>\w*</H\1>
结果:<H1>dfs</H1>
解析:其中的\1即表示引用第一个子表达式的结果,所以<H2>没有被匹配到
回溯引用的替换操作
例如
文本
333-123-1234
表达式
(\d{3})-(\d{3})-(\d{4})
将要替换的格式
$3-$2-$1
结果
1234-123-333
可以执行交换操作
前后查找
向前查找
?=
举例
例如
文本
http://127.0.01
https://127.0.0.1
表达式
.+(?=:)
结果
http
https
解析
只是使用分号来匹配到字符串,但是没有把分号放到结果中
向前查找模式的长度是可变的
负向前查找
?!
取反义
如上面的表达式为取分号之前的所有字符,如果变为负向前查找,则为符合.+并且后面没有分号的元素
向后查找
?<=
举例
文本
$23
$456
表达式
(?<=\$)\d+
结果
23
456
解析
向后查找放置在文本的最前面,向后边寻找匹配的字符
向后查找模式的长度是固定的
负向后查找
?<!
同理
当有匹配的内容不想让其出现在结果中时,这很有用
嵌入条件
当前后有一定的关联时
回溯引用条件
(?(backrefrence)true-regex|false-regex)
当引用的表达式匹配到时,会执行true-regex部分否则执行false-regex部分
举例
文本
<A><B></B></A>
<B></B>
表达式
(<A>)?(B)(?(1)</B></A>|</B>)
结果
两者都会被匹配
解析
当<A>存在时结尾就是</B></A>否则为</B>
前后查找条件
举例
文本
33-44
33-
44
表达式
\d*(?(?=-)-\d*)
结果
33-44
44
解析
当数字-被匹配到时,就匹配-\d否则什么也不匹配
java不支持嵌入条件
编程语言的不同
js
使用g进行全局搜索,使用i来不区分大小写
RegExp全局对象中保存了执行完表达式之后的所有信息
mysql
只支持搜索操作,不知持替换
搜索默认不区分大小写,要区分大小写语言在ReGex和模式中间加一个Binary
不支持回溯引用
不支持前后查询
不支持嵌入条件
不支持\a\b\e\f\v
语法
where REGEXP "expression"
java
不支持嵌入条件
不支持]\b匹配退格符
0 条评论
下一页