正则表达式 「学习笔记」

正则表达式 是字符串搜索与匹配的神器。

正则表达式最初起源并不是计算机科学家的成果,而是自动控制理论和形式语言的研究者开始提出并使用的。

最早将正则表达式引入计算机领域的是 肯·汤普逊,即 UNIX 的联合创始人。随着 UNIX 的流行和 Linux 的诞生,正则表达式被广泛应用到各种类 UNIX 系统和工具中。熟悉 Linux 命令的人都知道 Linux 有个查找字符串的神器指令:grep

如今,正则表达式已经无孔不入了,无论是程序员还是用户,都经常接触正则表达式,比如手机输入法,比如 Windows 里面的文件搜索,比如 Linux 的 ls,网站的登录和注册等等。

在用户注册验证的常见 3 种实现思路中,都用到了正则表达式,这也就是说各种编程语言都支持正则表达式。

前面写过 Ajax 登录验证时使用到了正则表达式,但是只是简单是使用了几句正则表达式,使用到的 PHP 正则函数就一个 preg_match(),而非系统的理论学习。现在将学习 正则表达式的基本语法 比较全面地总结一下。

不过,能不用正则的情况,尽量不用正则

界定符

表示一个正则表达式的开始和结束,通常有 3 种界定符:/.../#...#{...}

一般使用最多的是 /.../,比如:/[0-9a-zA-Z]/

原子

原子分为可见原子不可见原子

可见原子

指的是 Unicode 编码表中用键盘输出后 肉眼可见 的字符。主要有:

  • 标点符号: "_? 等。
  • 英文字母和数字。
  • 汉字、英语和其他语言文字。

这些可见原子在进行正则匹配的时候不能直接使用实际的语言词汇,而是要转换成 Unicode 编码。

  • 数理化公式符号。等其他可见字符。

不可见原子

指的是 Unicode 编码表中用键盘输出后 肉眼不可见 的字符。主要有:

  • 换行符 \n
  • 回车符 \r
  • 制表符 \t
  • 空格。等其他不可见符号。

原子的集合

  • .:匹配除换行符之外的任意字符。
  • \d:匹配任意一个十进制数字,即 [0-9]
  • \D:匹配任意一个非十进制数字,即 [^0-9]
  • \s:匹配一个不可见原子,即 [\f\n\r\t\v]
  • \S:匹配一个可见原子,即 [^\f\n\r\t\v]
  • \w:匹配任意一个数字、字母或下划线,即 [0-9a-zA-Z]
  • \W:匹配任意一个非数字、字母或下划线,即 [0-9a-zA-Z]

元字符

元字符指定了原子的筛选方式。主要有:

  • |:匹配两个或者多个分支选择。
  • []:匹配方括号中的任意一个原子。
  • [^]:匹配除方括号中的原子之外的任意字符。

量词

  • {n}:表示其前面的原子恰好出现 n 次。
  • {n,}:表示其前面的原子最少出现 n
  • {n, m}:表示其前面的原子最少出现 n 次最出 m 次。
  • *: 匹配 0 次、1 次 或者多次其之前的原 子 , 即 { 0, }
  • +:匹配 1 次或者多次其之前的原子,即 { 1, }
  • ?:匹配 0 次或者 1 次其之前的原子,即 { 0, 1 }

边界控制

  • ^:匹配字符串开始的位置。
  • $: 匹配字符串结束的位置。
  • ():匹配其中的整体为一个原子。

模式单元

总模式

每个 pattern 可以看作是一个总模式。

子模式

pattern 的每个模式单元 (...) 称为子模式,包含在总模式中。

常见修正模式

  • U:懒惰匹配,即是:只匹配最近的一个字符串,不重复匹配。
  • i:忽略英文字母大小写。
  • x:忽略空白。
  • s:让元字符 . 匹配包括换行符在内所有字符,即将字符串视为单行,换行符作为普通字符。
  • e:e 配合函数 preg_replace() 使用, 可以把匹配来的字符串当作正则表达式执行
  • D:如果使用 $ 限制结尾字符,则不允许结尾有换行。
  • A:强制从目标字符串开头匹配。
  • m:将字符串视为多行,不管是那行都能匹配。
  • g:表示全局匹配。

贪婪匹配

匹配结果存在歧义时取其长。

懒惰匹配

匹配结果存在歧义时取其短。

参考

Powered by Hexo and Hexo-theme-hiker

Copyright © 2017 - 2023 Keep It Simple And Stupid All Rights Reserved.

访客数 : | 访问量 :