加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

菜鸟眼里的正则表达式

发布时间:2020-12-14 02:23:23 所属栏目:百科 来源:网络整理
导读:给出定义 正则表达式总是那么神秘,反复学了多次,总也不能达到信手拈来的程度,每每用到都需要查手册,虽也方便,却很烦燥。所以需要正式的整理一番,写出来,要清楚一些。 正则表达式一定离不开模式匹配这个更显高级的词汇,模式匹配跟门当户对有点像。正

给出定义

正则表达式总是那么神秘,反复学了多次,总也不能达到信手拈来的程度,每每用到都需要查手册,虽也方便,却很烦燥。所以需要正式的整理一番,写出来,要清楚一些。

正则表达式一定离不开模式匹配这个更显高级的词汇,模式匹配跟门当户对有点像。正则表达式也就可以说是根据用户给出的规则,机器实现自动匹配的相关指令。简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。

我们什么时候使用正则表达式呢?不是所有的字符操作都用正则就好了,在某些方面用正则反而影响效率。当我们遇到复杂文本数据的解析时候,用正则是比较好的选择。

关键词

关键词的作用域

在表达式中,可以使用括号来表达不同符号的作用域,比如
[ ] 用于表示字符域
( ) 用于确定作用符的作用对象
{N,M} 用于指定匹配的次数介于N,M之间
^ 在其作用域内的字符组合,需要出现在被匹配对象开头
$ 在其作用域内的字符组合,需要出现在被匹配对象结尾

定界符

位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式,如果需要匹配的模式中含有大量“/”符号,则使用“#”取代之,此时不必对模式中的“/”进行转义。例如

/love/

#http://www.chinaunix.com/fuchao$/i#

元字符

所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

+ one or more
* zero or more
zero or one
. everyone but n
s space [tnrf]
S no space
d digital
D no digitial
w word
W no word

转义符

专业一点叫“跳脱字符”用于对上述元字符和控制字符进行转义,码工很熟,恕不多言。

注释

对于复杂的表达式,一定要给出相应的注释,以保证可读性和复用性。

注释方式为 ?#注释内容 例如:

1. $regex = '/

2. ^host=(?<!.)([d.]+)(?!.) (?#主机地址)

3. |

4. ([w!@#$%^&*()_+-]+) (?#用户名)

5. |

6. ([w!@#$%^&*()_+-]+) (?#密码)

7. (?!|)$/ix';

控制符

惰性匹配

如果前面有限定符,会使用最小的数据。如“*”会取0个,而“+”会取1个,如过是{3,5}会取3个。例如:

1. $regex = '/heL*?/i';

2. $str = 'heLLLLLLLLLLLLLLLL';

3. if(preg_match($regex,$str,$matches)){

4. var_dump($matches);

5. }

输出 “he”

数据捕获

没有指明类型而进行的分组,将会被获取,供以后使用。 指明类型指的是通配符。所以只有圆括号起始位置没有问号的才能被捕捉。在同一个表达式内的引用叫做反向引用。

调用格式: 编号(如1)。

避免捕获数据

格式:(?:pattern)

优点:将使有效反向引用数量保持在最小,代码更加、清楚。

命名捕获组

格式:(?P<组名>)

调用方式 (?P=组名)

修饰符

用于改变正则表达式的行为。

我们看到的('/^http://([w.]+)/([w]+)/([w]+).html/i')中的最后一个"i"就是修饰符,表示忽略大小写ignore,还有一个我们经常用到的是"x"表示忽略空格。

通配符

用于断言某些字符串中某些字符的存在与否。需要非常注意的是,此断言出的字符不做占位符。分为两种,正向断言和反向断言:

?= 正向的断言作用域内的字符会出现在当前向后的位置
?! 与?=意义相反,用法相同
?<= 反向断言作用域内的字符组合会出现在当前向前的位置
?<! 与?<=意义相反,用法相同

如何与程序衔接

PHP中可以使用ereg()函数进行模式匹配操作

JavaScript 1.2中带有一个功能强大的RegExp()对象

给个例子

验证E-mail地址

这是一个用于验证电子邮件的正则表达式。但它并不是高效、完美的解决方案。在此不推荐使用。

Php代码

1. $email = "test@ansoncheung.tk";

2. if (preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/',$email)) {

3. echo "Your email is ok.";

4. } else {

5. echo "Wrong email address format";

6. }

为了更加有效验证电子邮件地址,推荐使用filer_var。

Php代码

1. if (filter_var('test+email@ansoncheung',FILTER_VALIDATE_EMAIL)) {

2. echo "Your email is ok.";

3. } else {

4. echo "Wrong email address format.";

5. }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读