正则表达式---简
正则在许多语言里边都有出现,
php
、
java
、
C#
、
javascript
等都有,在各种语言中,正则表达式核心内容都完全一致,不过是每种语言使用正则时语法规则不同而已。
正则表达式的历史
正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。
1956
年
,
一位叫
Stephen Kleene
的数学家在
McCulloch
和
Pitts
早期工作的基础上
,
发表论文使用了正则表达式。
正则表达式的第一个实用应用程序就是
Unix
中的
qed
编辑器
正则表达式作用:
①
注册表单域验证
②
替换文本内容
str_replace()
③
提取子字符串
(
网络爬虫:一个网站去另一个网站偷信息
)
声明一个正则表达式
$pat = “/
正则内容
/”;
1、定界符
上图
左右
/
斜杠
代表定界符,
除了字母、数字和反斜线
\
以外的任何字符都可以作为定界符号,比如
| |
、
//
、
{}
、
!!
、
##
等等
正则表达式需要使用引号括起来,
单双引号都可以,例如:
$pat =
“
/[0-9]/
”
;
或
$pat =
‘
/[0-9]/
’
;
2、preg_match()函数
preg_match(
正则,目标内容,匹配结果
[
,下标标志
])
正则:设置好的正则表达式
目标内容:被匹配的目标字符串内容
匹配结果:此变量是引用类型,用于接收匹配到的结果,结果是
array
数组内容
(array()
空数组表示没有匹配到内容
)
下标标志:可选值为
PREG_OFFSET_CAPTURE
,表示同时返回匹配结果在目标字符串中的下标信息。该参数会更改返回结果数组的维数。
preg_match()
函数设置第四个参数的使用
(
不常用
)
:
preg_match()
函数使用细节:
①
该函数进行
单次
匹配,只把第一个符合正则的内容匹配出来,非全局匹配。
例如使用该函数,使得正则
/hello/
去
匹配字符串
“
hello
-
beijing hello-shanghai”,
则只给匹配第一个
hello
。
②
从目标字符串的
左边
开始进行匹配,寻找正则对应的目标内容
③
默认情况下,该函数给返回
一维
数组,数组元素值代表匹配的结果
如果该函数有设置
第四个
参数,则会返回一个
二维
数组,额外还会返回
匹配结果的
下标
信息
④
该
preg_match()
函数通过返回
1/0
的信息表示是否有匹配到内容,
1:
匹配到
0:
没有匹配到
3.1 正则内容组成
①
普通字符,例如数字、字母、特殊符号等,例如
$pat = “/hello/”;
是匹配
hello
的正则
②
定义字符集---
[a-e],
[aeiou]
匹配数字、英文字母的一段
,段的开始到结尾必须由小到大设置
定义字符集
里边都可以设置
^
符号,表示取非,例:
[^a-e]
随意
匹配
除了
a
到
e
连续字符
以外
的其他一个字符
③
特殊字符集
④
限制字符集
⑤
模式修正符
3.2 特别字符集
$
匹配目标字符串的
”
结尾
”
位置。
^
“
托字符
”
匹配目标字符串的
”
开始
”
位置
( )
标记一个子表达式的
”
开始
”
和
”
结束
”
位置
*
表示其前面那个单元出现
0
次或以上
任意次数
.
匹配除换行符
\n
之外的任何单字符
,
例如
.*
表示匹配任何内容
+
表示其前面那个单元出现
1
次或以上
任意次数
?
表示其前面那个单元出现
0
次或
1
次
要么出现、要么不出现
\
这个符号是用来转义的,去除符号的特殊意思,只保留符号的本质意思
|
指明两项之间只选择一个,或
的意思,
完整以目标字符串出现的先后顺序去匹配
在设计正则表达式的时候,
99%
的情况下都需要使用
^
和
$
符号
好处:可以使得正则表达式对目标内容进行“完整”匹配
(
非
部分匹配
)
完整匹配在某些时候是必须的
^
符号在不同场合的使用:
①
$pat = “/
^
hello/”; //hello
需要在目标内容
开始
出现
②
$pat = “/[
^
0-9]/”; //
匹配
非
0
到
9
之间数字
以外
的其他字符内容
()小括号:
标记一个子表达式的
”
开始
”
和
”
结束
”
位置
()
小括号作用:
①
提高子表达式优先级
②
可以从大的字符串中拆分小的内容出来
正则表达式又称为正则表达式模式,如果使用
()
给模式中的某个小的模式进行限制,该
()
小括号内容就称为
模式单元
$str="2016beijing2018beijing";
$pat="/beijing/";
$pipei=preg_match($pat, $str,$out);
var_dump($pipei);//int(1)
print_r($out);//Array ( [0] => beijing )
echo "<hr>";
preg_match($pat, $str,$out1,PREG_OFFSET_CAPTURE);
print_r($out1);
//Array ( [0] => Array ( [0] => beijing [1] => 4 ) )
3.3 组合字符集
\d
表示匹配
0
到
9
之间的一个数字
是
[0-9]
的别名
[1-9]
匹配一个非
0
数字
[5-9]
匹配
5
到
9
之间的一个数字
\w
表示匹配
(
大小写
)
字母
、
数字
、
下划线
其中的一个
[a-zA-Z0-9_]
\s
表示空格
//
匹配
hello
和
beijing
中间有三个空格
$pat = “/hello beijing/”; //
可读性不好
$pat = “/hello\s\s\sbeijing/”; //
可读性好
3.4 限制字符
{m}
其前一单元严格出现
m
次
{m,}
其前一单元出现至少
m
次,至多不限制
{m,n}
其前一单元出现至少
m
,至多
n
次,
n
比
m
要大
3.5 模式修正符
正则完全的设置:
$pat = “/
正则内容
/
模式修正符
”;
模式修正符:对正则的使用起着扩充、限制、修订的作用。
i
可同时匹配大小写字母
U
匹配到最近的字符串
(
避免贪婪匹配
)
3.6 进行全局匹配
preg_match()
可以通过正则对目标字符串进行“单次”匹配
preg_match_all(
正则,内容,匹配结果
)
函数
该函数返回二维数组,
可以实现对内容的全局匹配,所有与模式符合的内容都给匹配出来
$str="2016beijing[beiji20/18be*iji(ngdugbeijing";
$pat="/beijing$/";
$str="<h1>monkey like peach or banana</h1>";
$pat="/pear|banana/";//int(1) Array ( [0] => banana )
// $pat="/ban(ana)/";//int(1) Array ( [0] => banana [1] => ana )
// $pat="!<h1>(.*)</h1>!";
$pipei=preg_match($pat, $str,$out); //int(1)
var_dump($out);echo "<hr>";
$str="re23676@21cn.com";
// $str="15845678091";
// $pat="/([0-9]+)-([0-9]+)-([0-9]+)/";
// $pat="/1[358]{2}\d{8}/";//匹配手机号
$pat="#(^[a-z1-9][a-z0-9\.]{5,})@([a-z0-9]+)(\.[a-z0-9\.]+)$#i";//匹配邮箱
$pipei=preg_match($pat, $str,$out);
// echo $out[2],"<br>",$out[3],"<br>";03 01
echo "<pre>";
var_dump($pipei);//int(1)
print_r($out);
echo "<hr>";
preg_match($pat, $str,$out,PREG_OFFSET_CAPTURE);
print_r($out);
array(1) { [0]=> string(6) "banana" }
int(1) Array ( [0] => re23676@21cn.com [1] => re23676 [2] => 21cn [3] => .com )
Array
(
[0] => Array(
[0] =>
re23676@21cn.com
[1] => 0 )
[1] => Array(
[0] => re23676
[1] => 0 )
[2] => Array(
[0] => 21cn
[1] => 8 )
[3] => Array(
[0] => .com
[1] => 12 )
)
正则表达式速查表
字符 | 描述 |
---|---|
\ | 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n ”匹配字符“n ”。“\n ”匹配一个换行符。串行“\\ ”匹配“\ ”而“\( ”则匹配“( ”。 |
^ | 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n ”或“\r ”之后的位置。 |
$ | 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n ”或“\r ”之前的位置。 |
* | >=0匹配前面的子表达式零次或多次。例如,zo*能匹配“z ”以及“zoo ”。*等价于{0,}。 |
+ | >=1匹配前面的子表达式一次或多次。例如,“zo+ ”能匹配“zo ”以及“zoo ”,但不能匹配“z ”。+等价于{1,}。 |
? | 0或1匹配前面的子表达式零次或一次。例如,“do(es)? ”可以匹配“does ”或“does ”中的“do ”。?等价于{0,1}。 |
{n} | n是一个非负整数。匹配确定的n次。例如,“o{2} ”不能匹配“Bob ”中的“o ”,但是能匹配“food ”中的两个o。 |
{n,} | n是一个非负整数。至少匹配>=n次。例如,“o{2,} ”不能匹配“Bob ”中的“o ”,但能匹配“foooood ”中的所有o。“o{1,} ”等价于“o+ ”。“o{0,} ”则等价于“o* ”。 |
{n,m} | m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3} ”将匹配“fooooood ”中的前三个o。“o{0,1} ”等价于“o? ”。请注意在逗号和两个数之间不能有空格。 |
? | 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo ”,“o+? ”将匹配单个“o ”,而“o+ ”将匹配所有“o ”。 |
. | 匹配除“\ n ”之外的任何单个字符。要匹配包括“\ n ”在内的任何字符,请使用像“(.|\n) ”的模式。 |
(pattern) | 匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“\( ”或“\) ”。 |
(?:pattern) | 匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|) ”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies) ”就是一个比“industry|industries ”更简略的表达式。 |
(?=pattern) | 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000) ”能匹配“Windows2000 ”中的“Windows ”,但不能匹配“Windows3.1 ”中的“Windows ”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
(?!pattern) | 正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000) ”能匹配“Windows3.1 ”中的“Windows ”,但不能匹配“Windows2000 ”中的“Windows ”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 |
(?<=pattern) | 反向肯定预查,与正向肯定预查类拟,只是方向相反。例如,“(?<=95|98|NT|2000)Windows ”能匹配“2000Windows ”中的“Windows ”,但不能匹配“3.1Windows ”中的“Windows ”。 |
(?<!pattern) | 反向否定预查,与正向否定预查类拟,只是方向相反。例如“(?<!95|98|NT|2000)Windows ”能匹配“3.1Windows ”中的“Windows ”,但不能匹配“2000Windows ”中的“Windows ”。 |
x|y | 匹配x或y。例如,“z|food ”能匹配“z ”或“food ”。“(z|f)ood ”则匹配“zood ”或“food ”。 |
[xyz] | 字符集合。匹配所包含的任意一个字符。例如,“[abc] ”可以匹配“plain ”中的“a ”。 |
[^xyz] | 负值字符集合(非)。匹配未包含的任意字符。例如,“[^abc] ”可以匹配“plain ”中的“p ”。 |
[a-z] | 字符范围。匹配指定范围内的任意字符。例如,“[a-z] ”可以匹配“a ”到“z ”范围内的任意小写字母字符。 |
[^a-z] | 负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z] ”可以匹配任何不在“a ”到“z ”范围内的任意字符。 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b ”可以匹配“never ”中的“er ”,但不能匹配“verb ”中的“er ”。 |
\B | 匹配非单词边界。“er\B ”能匹配“verb ”中的“er ”,但不能匹配“never ”中的“er ”。 |
\cx | 匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c ”字符。 |
\d | 匹配一个数字字符。等价于[0-9]。 |
\D | 匹配一个非数字字符。等价于[^0-9]。 |
\f | 匹配一个换页符。等价于\x0c和\cL。 |
\n | 匹配一个换行符。等价于\x0a和\cJ。 |
\r | 匹配一个回车符。等价于\x0d和\cM。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。 |
\S | 匹配任何非空白字符。等价于[^ \f\n\r\t\v]。 |
\t | 匹配一个制表符。等价于\x09和\cI。 |
\v | 匹配一个垂直制表符。等价于\x0b和\cK。 |
\w | 匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_] ”。 |
\W | 匹配任何非单词字符。等价于“[^A-Za-z0-9_] ”。 |
\xn | 匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41 ”匹配“A ”。“\x041 ”则等价于“\x04&1 ”。正则表达式中可以使用ASCII编码。. |
\num | 匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1 ”匹配两个连续的相同字符。 |
\n | 标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。 |
\nm | 标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。 |
\nml | 如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。 |
\un | 匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(©)。 |
常用正则表达式
用户名 | /^[a-z0-9_-]{3,16}$/ |
---|---|
密码 | /^[a-z0-9_-]{6,18}$/ |
十六进制值 | /^#?([a-f0-9]{6}|[a-f0-9]{3})$/ |
电子邮箱 | /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/ /^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$/ |
URL | /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/ |
IP 地址 | /((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/ /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ |
HTML 标签 | /^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$/ |
删除代码\\注释 | (?<!http:|\S)//.*$ |
Unicode编码中的汉字范围 |
/^[\u2E80-\u9FFF]+$/
[\u4e00-\u9fa5]匹配中文字符(utf-8)---
匹配1到20个中文字符:/^[\u4e00-\u9fa5]
{1,20}$/
|