这是一篇总结,便于以后复习。学完之后,觉得其实写一些简单正则表达式并不是特别难。
它是什么?
通俗易懂的说,就是一条语句,然后能够在一堆字符中找到自己想要的字符。像一些文本编辑器,都能够通过正则表达式,像我们命令行中,我们想删除所有class文件,我们会输入:
del *.class
其中的*号就算一个正则表达式这就是一个简单的正则表达式。
对于我来说,它最大的用处是在爬虫中,能够准确定位自己想要的字符,数据等。
语法
一个正则表达式由两个部分构造而成
字符+重复次数
我们主要用到的一些元字符
元字符 | 意义 | 同义字符 |
---|---|---|
. | 匹配除换行符以外的任意字符 | |
\w | 匹配包括下划线的任何单词字符,类似但不等价于这个表达式"[A-Za-z0-9_]" | |
\s | 匹配任何不可见字符,包括空格、制表符、换页符等等。 | [ \f\n\r\t\v] |
\d | 匹配一个数字字符 | [0-9] |
[a-z] | 字符范围。匹配指定范围内的任意字符。例如,"[a-z]"可以匹配"a"到"z"范围内的任意小写字母字符。 | |
/ | 转义字符,将一些与元字符相同的字符转义使用 |
限制符 | 意义 |
---|---|
* | 重复前面的子表达式任意次。例如,zo*能匹配"z",也能匹配"zo"以及"zoo"。*等价于{0, }。 |
+ | 重复前面的子表达式一次或多次(大于等于1次)。例如,“zo+“能匹配"zo"以及"zoo”,但不能匹配"z”。+等价于{1, }。 |
? | 重复前面的子表达式零次或一次。例如,"do(es)?“可以匹配"do"或"does”。?等价于{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为一组。"o{0,1}“等价于"o?”。请注意在逗号和两个数之间不能有空格。 |
? | 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少地匹配所搜索的字符串,而默认的贪婪模式则尽可能多地匹配所搜索的字符串。例如,对于字符串"oooo","o+“将尽可能多地匹配"o”,得到结果[“oooo”],而"o+?“将尽可能少地匹配"o”,得到结果 [‘o’, ‘o’, ‘o’, ‘o’] |
| | 表示或者,如两个表达式被 | 隔开,只要符合其中之一表达式就会被匹配 |
更多的元字符符号我们可以看
正则表达式元字符
实例
我们可以找在线测试平台或者一个软件RegexBuddy去测试。
我们要匹配座机电话号码
0\d{2}-\d{8}
0然后再两个数字然后有一个 - 然后有8个数字
匹配0开头的3+8形式的数字组成的号码如053-12345678
0\d{3}-\d{7}
匹配0开头的4+7形式的数字组成的号码如053-12345678
贪婪匹配和懒惰匹配
比如我们一串字符
123abc?456dsad?789vcv?
我们想要匹配123abc?
我们用
.*?\?
.表示任意字符
*表示重复多次
*?表示懒惰匹配
\?表示问号
也就是尽可能少的匹配,只遇到第一个?就结束匹配
如果我们用
.*\?
贪婪匹配
那么他会匹配出
123abc?456dsad?789vcv?
尽可能多的匹配,直到遇到最后一个?才结束匹配。
组
我们用括号来表示一个组,将( 和 ) 之间的表达式定义为"组"(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。
就是我们想要匹配一串字符,同时想单独分离出这一串字符里的一小串字符,我们就可以将想要分离的单独字符的表达式用括号括起来,他会保存到一个临时区域,你可以单独调用。
pl:我们有一串字符是这样的
…好吃的东西"name":“泡面”,“brand”:“康师傅”,“productUrl”:"www.paomian.com"欢迎光临…
如果我们想要这个东西的信息
"name":"(.*?)",.*?"productUrl":"(.*?)"
用这个我们可以匹配出来
“name”:“泡面”,“brand”:“康师傅”,“productUrl”:“www.paomian.com”
然后我们单独调用匹配到的字符串的第一个括号内的内容group(1)里匹配到的东西那就是“泡面”。
处理选项
实际我们在使用的时候会有一些处理选项,通过在表达式里插记号的方式来启用绝大多数的模式,在正则的哪里插入,就从哪里启用。
(?i)
:忽略大小写(CASE_INSENSITIVE)
(?x)
:忽略空格字符(COMMENTS)
(?s)
:. 匹配任意字符,包括换行符(DOTALL)
(?m)
:多行模式(MULTILINE)
(?u)
:对Unicode符大小写不敏感(UNICODE_CASE),必须启用CASE_INSENSITIVE
(?d)
:只有’\n’才被认作一行的中止(UNIX_LINES)
结语
我也只是学到一些皮毛,还请大家多多担待。这是我自己所理解的一些正则表达式简单的使用方法。有什么错误的地方欢迎指正
我还看到一个入门视频教程挺好的,链接在这里
https://www.bilibili.com/video/av47287083
文章参考:https://www.w3cschool.cn/rxoyts/3rmwuozt.html