正则表达式(regular expression)
一、介绍
匹配文本内容的一种表达式。
-
其描述了一个规则,通过这个规则可以匹配一类字符串
-
简单的处理文本的语言
-
很多的编程语言都可以使用正则表达式
二、字符匹配
简单字符
写出一个普通字符串就会匹配一个字符串
简单的转义字符
-
\n
:换行 -
\t
:制表符 -
\\
:\本身 -
\@ \$
… 字符本身
标准字符集合 \type
-
\d
:任意数字,0~9中的一个 -
\D
:除了上面的都匹配 -
\w
:任意的字母或数字或下划线。即A~Z a~z 0~9 _中的一个 -
\W
:除了上面的都匹配 -
\s
:空格、制表、换行等空白字符中的一个 -
\S
:除了上面的都匹配 -
.
:可以匹配任一个字符(除了换行符)
如果要匹配包括\n在内的所有字符,一般用[\s\S]
自定义字符集合[ ]
[ ]
:匹配[ ]中的任一个字符,如[abc]匹配a或b或c
例子:
[^abc]
:匹配a或b或c之外的
[f-k]、[2-8]
:匹配f~k之间的包括边界 (-减号)
[^a-f2-3]
:匹配a~f 和 2~3之外的
注意:
-
如果特殊符号包含在[ ]中则会失去特殊意义,除了
^
-(减号)
-
[ ]
中有标准字符集合,除了.匹配任一个字符
之外,会匹配对应的的集合如
[\d.\-+]
匹配数字 .号 -号 +号
三、量词
修饰匹配次数的特殊字符
-
{n}
:匹配n次前一个表达式例子:
\d{6}
匹配6次\d,{}仅指明前一个表达式\d。等价于\d\d\d\d\d\d
(\d\d){6}
:12个\d -
{n,m}
:匹配最少n次,最多m次特性:默认贪心(匹配越多越好)
例子:\d{2,5}
文本:1234567
会匹配12345 而不是12
非贪婪模式(
{}?
:会将匹配改成匹配越少越好。) -
{n,}
:至少匹配n次 -
?
:匹配表达式0次或1次 ,相当于{0,1}
例子:
a\d?b
:匹配有ab并且其中有一个数字或没有数字的字符串 -
+
:匹配表达式至少1次 ,相当于{1,}
例子:匹配所有空白符
*
:匹配表达式不出现或任意次数的 ,相当于{0,}
四、描述字符边界(零宽度,匹配不到字符)
表示匹配的是一个位置而不是字符,其不占据位置(如:a\bb
:\b在a与b之间的位置)
符号:
^
:字符串开始的地方
$
:字符串结束的地方
\b
:匹配一个单词边界,前面的字符和后面的字符不全是\w
ignorecase
:忽略大小写模式
singleline
:单行模式 —— 把整个文本看作是一个字符串
multiline
:多行模式 —— 每一行都是一个字符串
在多行模式中若想匹配第一行\A
,最后一行\Z
五、正则语法
- 选择符与分组
-
|
:或 ,左右两边表达式为或的关系,匹配左边或者右边 -
()
:捕获组 ,匹配到的会被保存到内存中,每一个括号对应一个标号1,2,3… -
(?:Expression)
:不需要匹配到的内容,匹配到的内容不保存,大文本是需要考虑
-
反向引用
(\nnn)
\
后面的nnn
依次对应前期的()
已匹配出的内容 -
预搜索(零宽断言)
-
是对位置的匹配,其本身是不计入匹配结果的
-
(?= exp )
:断言自身的后面应该匹配exp表达式(?! exp )
:断言自身的后面不能匹配exp表达式(?<= exp )
:位置前面应该怎么样(?<! exp )
:位置前面不应该怎么样
六、练习
匹配中文字符:[\u4e00-\u9fa5]
匹配空白行:\n\s*\r
匹配HTML标记:<(\S*?)[^>]*>.*?<^1>|<.?/>
匹配首位空白字符:^\s*|\s*$
匹配Email地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网站URL:[a-zA-Z]+://[^\s]*
七、开发环境或文本编译器中使用正则
在Java中使用
正则中的\
在Java中变成\\
-
相关类在
java.util.regex
包下Pattern类:
正则表达式的编译形式
Pattern p = Pattern.compile(r,int);
//创建正则表达式,并启用相应模式Matchar类:
通过解释Pattern对character sequence执行匹配操作的引擎
Matter m = p.matcher(str);
//匹配str字符