正则表达式的基本使用

正则表达式的基本使用

1. 界定符

表示一个正则表达式开始与结束
有以下几种形式: // {} ##, 在PHP中一般使用//

2. 原子

分为可见原子与不可见原子
– 可见原子 如:abcd…
– 不可见 如:\n \r \t 空格 …

3. 元字符

| 或 ,代表分支(ch|aj|sd)
[] 方括号的意思是字符组,匹配方括号内的字符任选一个 如: [abc] [a-zA-Z]
^ 取反 如:[^abc],意思是非abc的其他字符,注意[cd^f]匹配的是cd^f其中一个字符,不是取反的意思
. 匹配除换行符之外的任意字符
\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_]
\b 代表着单词的开头或结尾,也就是单词的分界处。但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置
\B 匹配不是单词开头或结束的位置

4. 量词

量词对原子出现次数綦修饰及限制作用

{n} 前面的原子出现n次
{n,}前面的元字符至少出现n次
{n,m}表示前面的元字符出现n-m之间次

* 表示出现0次或多次,相当于 {0,}
+ 表示出现1次或者多次
?0次或1次

5. 边界控制

^ $
– ^ 匹配字符开始的位置
– $ 匹配字符结束的位置

6. 模式单元(捕捉) 与 零宽断言

模式单元(捕捉)

(pattern)
匹配 pattern 并获取这一匹配。将括号之间的正则表达式当做一个原子(子表达式)来进行匹配,并且会将匹配上的字符捕捉下来供后面使用,所捕捉的匹配可以从产生的 Matches 集合得到,$0…$9 属性。
(?pattern)

匹配pattern,并捕获文本到名称为name的组里,也可以写成(?'name'exp) 

(?:pattern)
匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (|) 来组合一个模式的各个部分是很有用。例如, ‘industr(?:y|ies) 就是一个比 ‘industry|industries’ 更简略的表达式。

7. 零宽断言

(?=pattern) 匹配pattern前面的位置(后面跟的是pattern的位置)

参考解释:正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 

匹配正则 \d(?=px)

准备好的被匹配文本 1pt 2px 3em 4px

上面的正则会匹配出 2,并且下次匹配位置停留在"2"后(也就是剩下未匹配的文本是"px 3em 4px"),也就是说(?=px)表达式只是断言在\d后面有"px"字符的位置,而不消耗多余的字符,只是起着辅助的作用,实际上并不捕捉括号的内容

也就是说(\d(?=px)px)也能匹配到"1pt 2px 3em 4px"中的2px(不消耗字符的理解)

(?!pattern) 匹配后面跟的不是pattern的位置

参考解释:负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 

(?<=pattern) 匹配epattern后面的位置

(?<!pattern) 匹配前面不是pattern的位置

8. 修正模式

  • i (IgnoreCase) 模式中的字母会进行大小写不敏感匹配​

  • x 忽略空白

  • s 让.匹配所有字符

Flag 解释
i (IgnoreCase) 模式中的字母会进行大小写不敏感匹配
m (Multiline) (多行模式)更改^和\$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含意是:匹配\n之前的位置以及字符串结束前的位置.)
s (Singleline) 如果设置了这个修饰符,模式中的点号元字符匹配所有字符,包含换行符。如果没有这个 修饰符,点号不匹配换行符。
x 如果设置了这个修饰符,模式中的没有经过转义的或不在字符类中的空白数据字符总会被忽略, 并且位于一个未转义的字符类外部的#字符和下一个换行符之间的字符也被忽略。

9. 贪婪与懒惰

​ 当正则表达式中包含量词时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。

​ 以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。

​ 有时,我们更需要匹配尽可能少的字符(懒惰匹配)。前面给出的量词都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。

​ 懒惰的例子:a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。

表达式 说明
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

10. 反向引用

# 正则表达式中使用前面捕捉的字符做元字符
正则:(\w)a\1             [注意理解\1,就是(\w)捕捉出来的内容]
字符:hah dad bad dab gag gab
被捕捉的:
    h
    d
    g

11. 一些匹配示例

(http.+?.mp4.+?)(?=”|’)

[^>] ^表示不匹配其后的字符
/<[^>]*>(.*)<\/([^>]*)?>/

[\s\S]* 匹配所有字符

匹配特定字符串


# 匹配ip地址 \d+\.\d+\.\d+\.\d+ # 匹配网址URL [a-zA-z]+://[^\s]* # 匹配HTML标记 < (\S*?)[^>]*>.*?|< .*? /> # 匹配中文字符 ^[\\u4e00-\\u9fa5]{0,}$ # 校验手机号 ^1[3|4|5|7|8]\d{9}$ # 判断IE的版本 ^.*MSIE [5-8](?:\\.[0-9]+)?(?!.*Trident\\/[5-9]\\.0).*$ # 邮箱 /^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/;

发表评论

电子邮件地址不会被公开。 必填项已用*标注