正则表达式


1课程安排

目标:了解正则表达式的功能和使用场景,掌握基本正则书写语法。


2正则表达式简介

正则表达式是什么

正则表达式本身就是一种语言,这在其它语言是通用的

正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。 

strpos(‘abc’);  //精确匹配   只能匹配字符串“abc”

正则表达式 //模糊匹配


在SQL中

Where name=’zhangsan’; //精确匹配

Where name like ‘zhang%’; //姓名以zhang开始的字符串


为什么使用(使用场景)

    1)验证邮箱   kunx@kunx.org   kunx@xianrentiao.cn   admin@kunx.org

    2)手机号     17002810530     15888888888     18777777777

    3)银行卡号

    4)采集器

    5)中奖信息 138****8888

    6)屏蔽特殊词汇


3入门

 正则表达式_正则表达式


4常用的函数


preg_match()

preg_match_all()

preg_replace()

匹配模式

i忽略大小写

x去除规则中的空白

U非贪婪

 

4几个重要的概念

    1子表达式

在正则匹配模式中,使用一对括号括起来的内容是一个子表式

    2捕获

在正则匹配模式中,子表达式匹配到的内容会被系统捕获至系统的缓冲区中

    3反向引用

捕获之后,可以在匹配模式中,使用\n (n:数字)来引用系统的第n号缓冲区内容

 正则表达式_正则表达式_02


5练习

1对称字符

匹配几个字母后面三个数字接着是前面字母的重复,比如:abc123abc

/(\w+)\d\d\d\1/

(\w+)\d+\1


2连续数字

匹配连续四个数字,比如abcd9527fadsas

/\d\d\d\d/


3对称数字

查找这样的数字

1221

4334

/(\d)(\d)\2\1/


4成对字符

查找类似:

AABB

KKLL

/(\w)\1(\w)\2/


5相同字符

比如:

AAAA

4444

/(\w)\1\1\1/


6匹配出姓名:

my name is xxx。

i am 18 years old.


6语法细节

正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。


正则表达式的构成:


    1)普通字符 :a b c d 1 2 3 4 ........

    2)特殊字符(元字符):\d \D \w . .......


我们在写正则表达式的时候,需要确定这样几件事:


    1)我们要查什么

    2)我们要从哪查

    3)我们要查多少


7限定符

限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。


    * 匹配前面的组件零次或多次

    + 匹配前面的组件一次或多次

    ? 匹配前面的组件零次或一次

    {n} 匹配确定的 n 次

    {n,} 至少匹配n 次

    {n,m}  最少匹配 n 次且最多匹配 m 次


也可以使用以下方式表示:


*             {0,}

+ {1,}

? {0,1}


8贪婪模式

如果在表达式的后面使用'?',表示非贪婪匹配原则,就会尽可能匹配少的,示例如下:

$reg = '/<.*?>/';
$str = '<span>1111</span><span>222</span>';
preg_match_all($reg, $str, $rst);
var_dump($rst);
array(1) {
  [0]=>
  array(4) {
    [0]=>
    string(6) "<span>"
    [1]=>
    string(7) "</span>"
    [2]=>
    string(6) "<span>"
    [3]=>
    string(7) "</span>"
  }
}



9字符匹配符

字符匹配符用于匹配某个或某些字符


1字符簇

[a-z] :表示a-z任意一个字符

[A-Z] :表示A-Z任意一个字符

[0-9]   :表示0-9任意一个数字

[0-9a-z] :表示0-9 a-z任意一个字符

[0-9a-zA-Z] :表示0-9 a-z A-Z任意一个字符

[abcd] :表示a 或b 或c 或 d

[1234] :表示 1 或2 或3 或 4

[^a-z] :表示匹配除了a-z之间任意一个字符

[^0-9] :表示匹配除了0-9之间任意一个字符

[^abcd] :表示匹配除a b c d 之外的任意一个字符

\d :匹配一个数字字符。[0-9]

\D :匹配一个非数字字符。[^0-9]

\w :匹配包括下划线的任何单词字符。[0-9a-zA-Z_]

\W :匹配任何非单词字符。[^\w]

\s :匹配任何空白字符   空格、制表符、换行符

\S :匹配任何非空白字符。 

.  :匹配除 "\n" 之外的任何单个字符   如果想匹配任意字符 [.\n]


2定位符

定位符可以将一个正则表达式固定在一行的开始或结束。也可以创建只在单词内或只在单词的开始或结尾处出现的正则表达式。 


匹配输入字符串的开始位置

匹配输入字符串的结束位置

\b  匹配一个单词边界

\B  匹配非单词边界


3转义符

\ 用于匹配某些特殊字符

需要转义的字符有:

(

)

[

]

{

}

\

.

/

*

+

?

^

$


4选择匹配符

可以匹配多个规则,|两边各是一个选项


$str = 'hello,world,hello,php';

$reg = '/hello,world|php/';//hello,worldphp

$reg = '/hello,(world|php)/';hello,worldhello,php


5表达式的分界符

表达式必须用分隔符闭合, 比如一个正斜杠(/). 分隔符可以使任意非字母、数字、反斜杠(\)和空字节之外的非空白ascii字符. 如果分隔符 在表达式中使用, 需要使用反斜线进行转义. 自php 4.0.4开始, 可以使用perl样式的(), {}, []以及<>作为分隔符. 


练习:

邮箱地址

用户名可以是字母数字下划线

域名必须有点,最后一段不能带有数字


kunx@kunx.org

kunx-edu@qq.com 不合法的

admin@cc 不合法的

admin@xianrentiao.cn合法的


用户名部分:字母数字下划线

\w+

@

域名部分

\w+\.[a-z]+


参考答案:\w+@(\w+\.)+[a-z]+


匹配IP地址

0-255第一段不能是0

[1-9]

[1-9][0-9]

1[0-9][0-9]

2[0-4][0-9]

25[0-5]


第二段:

[0-9]

[1-9][0-9]

1[0-9][0-9]

2[0-4][0-9]

25[0-5]

第三段和第二段一样


关于正则表达式的几种特殊用法

正则表达式_正则表达式_03

转载自:http://www.codexueyuan.com/learn/learn-detail187