正则表达式基础(更新中。。。)

前端之家收集整理的这篇文章主要介绍了正则表达式基础(更新中。。。)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

问题1:我是怎么接触到并开始学习正则表达式?

答:

@H_502_14@ 最初看到正则表达式这个词是在接触学习UltraEdit、Notepad++、UEditor等支持正则式搜索的编辑器时,当时还莫名其妙。

@H_502_14@ 真正开始学习是在自己想下载某个网站的所有图片时,在文章的末尾我会写出实现的方法
后来接触了Perl,才开始认识到正则式的强大。还是那句话写得好:“只要你接触了正则式,那么你的Perl程序中少不了它的身影,因为它太好用了。”

开始学习时的热身:

1.正则式和通配符(如*和?)的区别。

答:

两者基本没有联系,只是同时使用了*和?这两个符号而已,千万不要把它们联想在一起,更不要试图把它们拧在一起理解,不然很有可能你就精神错乱了。

通配符的'*'表示匹配多个任何字符,我们常用它来匹配*.txt,*.doc等符合某种格式的文档,而'?'与‘*’的不同在于,*匹配多个,而?只匹配一个字符。当然这两者还有很多妙用,这里就不细说了。

前面我们知道了*和?在通配符中的用途,而在正则式中它们的意义则完全不同。


真正意义上的开始:


过多的细节我就不说了,这里我基本把它作为一个正则式各种繁杂元字符的汇总备忘。

要理解正则式,其实我本人认为只要理解一点就算入门了,就是:

“正则式就是用来匹配符合某种格式的字符串的,而正则式的各种元字符就代表了各种匹配条件,比如:\d 就是在说‘这里是一个数字’,\d* 就是在说‘这里是任意数目的数字,可能是任意多个,也可能是一个都没有’”,

不知道我这样的理解是不是属于狭隘,反正我自己是这么理解的,也不管砖家是怎么说了。



我会按我自己的理解重组各种元字符,而不是像其他介绍中的那么介绍,那样的话,我觉得有点别扭。


各种元字符:


单个匹配:

\d 匹配一个数字
\w 匹配一个单词,计算机所能理解的单词是指:字母或数字或下划线或汉字等
\s 匹配一个空白,包括空格,制表符,换页符等
. 匹配一个除了换行符之后的任意一个字符


指定特定的位置:

^ 代表开头, 如:^a 匹配以a开头的字符串
$ 代表结尾,如:a$ 匹配以a结尾的字符串

\b 单词的开头与结尾 如:\babc\b 匹配abc,这样就不会匹配到abcd了

它可以匹配围绕在单词周围的标点符号


指定范围:

[.?!] 匹配?.! 中的其中一个
[a-z] 所有的小写字母里
[f-k] 字母‘f’到‘k’之间的字符
[a-zA-Z0-9] 所有的大小写字母和数字
[^abc] 不匹配abc中的一个


各种量词,用来控制次数

  1. a.从少到多排序:

? 匹配0次或者1次,相当于{0,1}

助记: ? 疑问,有?还是 没有? 这样我们就记住了,可能有,也可能没有嘛。

+ 匹配多于1次,即一定到匹配一次前面的字符。

@H_403_313@助记:+ 加代表一定要有,即至少也要匹配一次

* 匹配任意多个或者不匹配。

@H_403_313@助记:* 在数学中代表任意,可以是零,也可以是无限


b.指定一个重复的范围:
{n} 重复n次
{m,n} 重复次数为 m到n 之间的数字,含m与n

分支条件:

| 意思:或 例子:(Tom|Jack) 匹配Tom或者Jack中的一个


转义字符(取消特殊含义,或者赋予):
\t \n \r (分别的含义:制表符,换行符,回车)

\\ \^ \. \*

解释:(\ ^ . 都是在正则式中有特殊含义的,加入 \ 后可以取消它原本的意义,只是作为一个普通的文本字符)


分组:

() 用小括号包含表达式叫分组,所以单独使用(时,需要转义,写成:\(。括号中的内容会记录在反向引用\1 \2 等中


修饰符:

i 匹配时不区分大小写
g 全局匹配

s 忽略空白


匹配某一个位置:


几个规律:

1. 一般在正则式中,大写字母是作为反义存在的,如:\s代表匹配一个空白,而\S代表着非空

\D 匹配任意非数字的字符

2. 贪婪模式,和非贪婪模式(勉强模式)



说了这么多,还是上几个实例,大家对照前面的知识点来理解哈。

\bhi\b.*\bLucy\b .*表示匹配任意数量的不包含换行的字符,\bhi\b \bLucy\b 意思是单单匹配hi和Lucy,而不匹配类似high或者Lucyman之类的。这条语句会匹配类似,hi,nice to meet you,Lucy.

0\d{2}-\d{8} 会匹配符合中国的电话号码格式的数字,如100-35838475

\(?0\d{2}[)-]?\d{8}) 匹配多个格式的电话号码,像(010)88886666,或022-22334455,或02912345678,这里的()需要转义

^\d{5,12}$ 匹配QQ的格式,5到12个数字,比如我的QQ:871892708
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) 匹配IP地址的正则表达式

还有几个高级技巧,以后再补充。如果应付不太繁重的正则式工作,上面的就够用了。


正则式的基本规则就是以上了,重点是自己会不会灵活运用。我们要根据我们所有匹配的字符串的特点来写相应的正则表达式。


幕后:

推荐书籍:《精通正则表达式》
最初引我入门的文章"正则表达式30分钟入门教程"

参考文档:揭开正则表达式的神秘面纱


最近我的一个小运用(提取某网站中的所有GIF图片):


a.某网站,http://7chan.org/gif/,上面有很多很“动感”的GIF图片,我想一次性全部都下载下来然后慢慢筛选,要是一次次右键另存为···,那我估计我迟早得疯掉。


b,基本思路:把所有我想要下载的GIF的链接提取到一个桌面的txt文档中,然后用迅雷批量下载,当然也可以调用wget命令。


c,代码实现:这里我用的是Perl语言,尤其擅长处理正则式。


代码,勿笑我水平低哈:

#! /usr/bin/perl

open FILE,'> C:\Users\ite\Desktop\resources.txt'; #不能用“”,因为\U \i 会被转制 use 5.010; use utf8; use LWP::Simple; $url = "http://7chan.org/gif/"; $content = get $url; while ($content =~ s#(https://7chan.org/gif/src/.*?gif)# #){ say FILE $1; }

原文链接:https://www.f2er.com/regex/363108.html

猜你在找的正则表达式相关文章