正则表达式
前言
正则表达式是一套语法规则,适用于各大编程语言。本文章正则表达式匹配的演示近使用PHP语言进行匹配。其他语言只是所使用的函数不同。
简单介绍正则表达式
- 正则表达式就是描述字符串排列模式的一种自定义语法规则
- 如果可以使用字符串处理函数完成的任务,就不要使用正则表达式,正则的效率比较低。
- 有一些复杂性的操作,只能用正则表达式来完成。
- 正则表达式也称为一种模式表达式
- 正则表达式就是通过构建具有特定规则的模式,在与输入的字符串进行比较、分割、匹配、查找和替换。
什么是正则表达式
- 例子:
'/<img\s+src=\".*?\" \/>/'
它就是正则表达式 - 乱七八糟的一对字符堆在一起,神秘的符号,有奇特的意义。
正则表达式的用处
- 验证用户名长度是否合法。
- 验证邮箱规则
- 验证手机号
- 验证URL
- BBS编辑器
- QQ聊天表情
- 新闻采集器(小偷程序)
正则表达式的特点
- 正则表达式也是一个字符串
- 由具有特殊意义的字符串组成的字符串。
- 具有一定编写规则,也是一种模式。
- 看做是一种编程语言,因为是用一些特殊的字符,按照规则编写处一个字符串,形成一种模式 —— 正则表达式。
- 如果正则表达式不和函数一起使用,则它就是一个普通的字符串。如果将正则表达式放到某个函数中使用,才能发挥正则表达式的作用。
##: PHP中提供的两套正则表达式函数库
posix
扩展正则表达式,大多以ereg
开头perl
兼容正则表达式,大多以preg
开头- 推荐使用
perl
兼容正则表达式函数库
正则表达式知识点
- 正则表达式的模式如何编写
- 学习正则表达式的强大处理函数
正则表达式的语法
- 正则定界符
- 正则表达式中的原子
- 正则表达式的元字符(原子修饰符)
- 正则表达式的模式修正符
正则表达式的定界符
- 正则定界符就是用来声明正则表达式边界的符号,正则表达式时字符串类型。所以在定义正则表达式时先定义字符串类型
- 正则表达式常用的定界符为
/
,实际上除了字母和赎罪以及\
之外的字符都可以作为正则表达式的定界符使用。 - 注意:一个完整的正则表达式准确的说有两个定界符。
- 第一个是字符串类型的引号边界符
- 第二个是正则表达式的边界符
1 | <!DOCTYPE html> |
正则表达式中的原子
什么是原子?组成正则表达式中的最小单位就是原子。
原子有哪些内容组成?
正常的字母都是原子,所有可见字符都是原子
大部分不可见字符也都是原子,比如
\n
,\t
,\r
\d
表示匹配0-9之间的任意字符。[0-9]
\D
表示匹配除了0-9之间的任意字符。[^0-9]
\s
表示匹配空白字符、包括空格、\n
,\r
,\t
中的任意一个字符\S
表示匹配除了空白字符、包括数字、\n
,\r
,\t
中的任意一个字符\w
表示匹配数字、大小写字母以及下划线中的任意一个字符\W
表示匹配除了数字、大小写字母以及下划线中任意一个字符[]
原子列表- 表示在指定的字符中选取一个原子
[5-9]
表示匹配5,6,7,8,9中的任意一个字符,允许缩写为开始字符-结束字符,比如[a-z]
,[A-z]
等等
[^ ]
排除列表[^ abc]
表示除了abc之外的所有字符都可以匹配成功
.
匹配除\n
以外的所有字符,如果想要.
匹配到\n
,则需要使用模式修正符s
元字符(原子修饰符)
+
表示前面的原子可以出现一次或者多次(否则匹配失败)。{1,}
?
表示前面的原子可以出现0次或者一次。{0,1}
*
表示前面的原子可以出现0次或者多次。{0,}
{m,n}
表示前面的原子最少出现m次,最多出现n次。{m}
表示前面的原子出现指定的m次。{m,}
表示前面的原子最少出现m次。什么是词边界(只对英文有效)
- 可以分割一个单词的字符都是词边界,包括空格,标签符号,特殊字符,词边界在字符串开始和结束,或者每一行的结束。
- 不可以当做词边界的就是数字、字母和
_
\b
词边界\B
非词边界
字符串边界修饰符
^
表示以指定字符开头的内容$
表示以指定字符结尾的内容^字符串$
表示精准匹配某个字符串,多一个少一个都算错。注意:如果要使用
^
和$
可以匹配每一行的开始和结束部分,需要使用后面学习到的模式修正符m
,视为多行处理1
2
3
4$str = "hello\nx1ong\n!!!!";
$pattern = "/^x1ong$/m"; // 正则表达式
$res = preg_match($pattern, $str,$match);
选择修饰符
|
或者的意思1
$pattern = '/hello|world|x1ong/'; // 正则表达式
模式单元
()
- 改变优先级
- 将多个原子视为一个原子,好处可以使用原子数量修饰符
- 将匹配到括号内容暂时存放在内存当中
- 如果使用
()
仅仅为了模拟一个原子使用原子修饰符,那么可以在括号的开始处使用?:
来解除存于内存的作用,提高效率。 - 可以将括号的内容在函数的辅助下进行反向引用操作
正则表达式匹配url
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form method='post'>
<input type="text" name="str">
<input type="submit" value="提交">
</form>
</body>
</html>
$str = @$_POST['str'];
$pattern = '/(?:^[a-zA-Z]{3,5}:\/\/)?(?:[a-zA-Z0-9-]+\.)?[a-zA-Z0-9-]+\.[a-zA-Z]{2,}$/'; // 正则表达式
/*
匹配域名:
http://www.baidu.com
https://www.baidu.com
https://www.123456.com
http://baidu.com
www.baidu.com
biadu.com
ftps://www.baidu.com
ftp://www.baidu.com
*/
$res = preg_match($pattern, $str,$match);
echo '匹配结果为: ' . $res;
echo '<hr />';
if ($res) {
echo '<font color="green" size="5">匹配成功</font>';
}else {
echo '<font color="red" size="5">匹配失败</font>';
}
echo '<br />';
print_r($match);模式修正符
i
忽略大小写x
忽略正则中的空白s
默认情况下.
可以匹配除了\n
以外的任意字符,但是匹配不了\n
也就是换行符,那么如果想让\n
被匹配到,就需要使用s
这个修正符m
视为多行处理,在该模式下^
和$
会从换行之后的字符重新匹配S
加速匹配U
模式(改变贪婪模式)- 改变贪婪模式,程序默认是贪婪匹配的,匹配最后的结束为止,我们可以在正则中使用.*?匹配任意字符的同时使用非贪婪模式。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 X1ong!