1.1 正则表达式
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
我们许多的 程序语言,都是内置 正则表达式,对我们写的 代码进行 判断和处理的。
无论 您用 Python、JavaScript 或 Java ,正则表达式 都不是 它们的 独特标准,而是 具有 一个 很规范的 统一。学会 通用正则 才能 更好的 把它用于 这些 编程语言中。我们经常会用它 处理大量的字符串文本 和 命令行!
正则表达式 是略微复杂的,这也证明 正则 可以 帮你做很多事。(你能够想象?正则 几乎可以处理任何情况的文本吗?)
1.1.1 直奔主题
- 顺序很重要
当你 如数 ABC 和 BCA 的时候 匹配到的 完全就是两个东西,(当然 大小写字母是不会被区分的!)这属于 精准搜索。你输入的正则也必须 精准。
- 一些特殊字符 需要转义才能搜索
比如说:.[{()^$ | ?*+
当我们 只 输入一个 . 的时候。
你会发现 它做了一个比较 奇怪的操作,它会把 所有的 字符 都搜索出来,也就是说 对于 它来说,所有的 单个字符 都是 匹配的!
而当你 在特殊字符 前面 加一个 反斜杠的时候,它就只会 搜索 点 或 句点。(这就是转义字符)
- 转义字符的魅力
\d : 搜索 0-9 的一个数字
\D : 不搜索 0-9 的一个数字
\w : 搜索 a-z、A-Z、0-9、_ 的一个字符(下划线)(不搜索特殊字符)
\W : 不搜索 a-z、A-Z、0-9、_ 的一个字符(下划线)(就搜索特殊字符)
\s : 搜索 space(空格)、tab(制表符)、newline(新的换行)的一个字符
\S : 不搜索 空格、制表符和换行符 的一个字符
!!下面的转义字符实际上不匹配 任何字符(所以它们被称为锚点)!!
- \b :针对词边界的搜索(\bHa 意思是 Ha词边界Ha 就只能搜到边界后面的Ha,而不能 搜索到 前面没有 词边界的 Ha)
词边界:就是 空格、换行符、制表符!
- \B :不针对 词边界来搜索。(\BHa 它就只能 搜索到 前面没有空格、换行符、制表符 的 Ha)
- ^ : 针对于 一行字符串的开头 来进行搜索
- $ : 针对于 一行字符串的结尾 来进行搜索的。
实战: 匹配 分隔符为(- .)的电话号码
. 只能匹配 一个 任意字符
上述的方法其实可以很好的解决,但是我们会 遇到一个致命的问题。当我们 出现 并非 正确 分隔符的 电话号码时:
它居然也会 进行匹配!这要怎么办呢,我们只需要 匹配 分隔符是 . 或 - 的就可以了。
- [] :字符集符号,**意思是 只要出现了 [] 里面的一个字符,就会被匹配!! **
正则格式:\d\d\d[.-]\d\d\d[.-]\d\d\d\d
[a-z]:就是 只要 碰到 a-z 其中一个字符 就匹配
[0-9]:就是 只要 碰到 0-9 其中一个字符 就匹配
所以 \d \w 这些 只是 对 [] 字节集 进行了封装而已呀。
[^]:意思是 非!就是不能匹配 那些 字符!!
[^a]:就是不能匹配 a 这个字符。
[^a-z]:就是不能匹配 a-z 任意一个字符。。
- ():指的是 一组,就是 把一个 匹配的正则 包含起来,当成 一个整体 来处理!
1.1.2 Quantifiers 量词
- * :匹配 0 次 或 多次(至少匹配0次)
- + :匹配 1 次 或 多次(至少匹配1次)
- ? :匹配 0 次 或 1次(该字符可有可无)
- a{3}:匹配 a 字符 3次
- ==a{3,4}:最少匹配 a 字符 3次,最多匹配 4次 ==
- () 和 | 的使用
() 可以处理我们 [] 处理不了的东西,这是因为 [] 只能匹配一个字符,而 () 却可以 把多个 正则匹配包括起来,形成一个 组!而不是 仅限于 一个 字符!!!
如果 学完了 以上所有的基础知识,那我们 就 可以 做一些 实战 练习了。
1.1.3 实战练习
- 邮箱判定
CoreyMSchafer@gamil.com
CoreyMSchafer@gamil.cao.com
corey.schafer@university.edu
cor.ey.schafer@university.edu
corey-321schafer@my-work.net
corey-321-schafer@my-work.net
99565687@qq.com
正则表达式:[\w\d]+[\.-]?[\w\d]+[\.-]?[\w\d]+@[\w\d]+(\.[\w\d]+(\.[\w\d]+)?|-[\w\d]+\.[\w\d]+)
2. URL判定
https://www.google.com
http://coreyms.com
https://youtube.com
https://www.nasa.gov
http://www.www.wwww.dsadasd.sdasdasd.com
正则表达式:https?://(w{3})?[\w\d\.]*\.[\w\d]+
分组的第二个好处是:只有 分组的 正则匹配,才能够 被直接 取出来 查看!! 编程语言 也都是 用 () 分组的 正则匹配 给你 响应的 正则 反馈的 !!
这个 你可以 在 Python 语言的 re 库里,深深的 感应到。
比如你想要直接 暴力的 取出 两个 文本 的中间文本!
左文本(.*?)右文本
.*? 是什么意思呢 ?
. 是匹配任意一个字符!* 是 让其变成匹配 0 个 或 多个 任意字符。? 是这些字符可有可无!