html' target='_blank'>正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。
元字符使用正则表达式具有处理能力。元字符既可以是放在[ ]
中的任意单个字符(如 [a]
表示匹配单个小写字符 a
),也可以是字符序列(如 [a-d]
表示匹配 a 、b、 c、 d
之间的任意一个字符,而 /w
表示任意英文字母和数字及下划线),常见的元字符如下:
字符 | 描述 | 特别说明 | . | 匹配除换行符(/n )以外的任意字符 | ~ | [abcde] | 匹配 a b c d e 之中的任意一个字符 | 所有字符是 或 的关系 | [a-h] | 匹配 a 到h 之间的任意一个字符 | ~ | [^fgh] | 不与 fgh 之中的任意一个字符匹配 | 在 中括号[ ] 的第一个字符前加上 ^ 表示 取反 不匹配中括号里面出现的任意字符 | /w | 匹配大小写英文字符及数字 0 到 9 之间的任意一个及下划线,相当于[a-zA-Z0-9_] | ~ | /W | 与 /w 相反,相当于 [^a-zA-Z0-9_] | ~ | /s | 匹配任意的空白符,相当于 [/f/n/r/t/v] | ~ | /S | 与 /s 相反,相当于 [^/s] | ~ | /d | 匹配任何 0 到 9 之间的单个数字,相当于 [0-9] | ~ | /D | 与 /d 相反,相当于[^0-9] | ~ | [/u4e00-/u9fa5] | 匹配任意单个汉字(中文)(这里用的是 Unicode 编码表示的汉字) | ~ | /b | 匹配单词的开始或结束 | ~ | ^ | 匹配字符串的开始 | 放在中括号的第一个字符前 则变为 取反的意思 | $ | 匹配字符串的结束 | ~ |
---|
作用:限定这个符号前面 一个 单元 多出现的次数
单元:
上面的元字符都是针对单个字符匹配的,要想同时匹配多个字符的话,还需要借助限定符,下面是一些常见的限定符(下表中 n
和 m 都是表示 整数。)
字符 | 描述 | 特别说明 | * | 匹配 0 到 多 个元字符,相当于 {0,} | ~ | ? | 匹配 0 到 1 个元字符, 相当于 {0,1} | ~ | + | 匹配至少 1 个元字符,相当于 {1,} | ~ | {n} | 匹配 n 个元字符 | ~ | {n,} | 匹配至少 n 个元字符 | ~ | {n,m} | 匹配 n 到 m 个元字符 | ~ | /b | 匹配单词边界 | ~ | ^ | 字符串必须以指定的字符开始 | ~ | $ | 字符串必须以指定的字符结束 | ~ |
---|
分组
,比如 ^(13)[4-9]/d{8}$
表示任意以 13 开头的移动手机号码。abcabcabc+
表示 最后的字母 c
出现 1 次或 多次;(abcabcabc)+
表示 整个字符串 abcabcabc
出现 1 次或 多次。|
来表示 或
的关系,例如 z|j|q
表示匹配 z 、j、q
之中的任意一个字母。其实等价于 [zjq]
。ab|cd|ef
表示的是:要么是 ab
、要么是 cd
要么是 ef
。a(b|cd|e)f
表示的是:以a
开头,要么是 b
、要么是 cd
要么是 e
,最后以f
结尾。|
(或
) 的唯一边界是 小括号(( )
)[0-9A-Z.?]
这个正则你如何理解?.
和 ?
出现在中括号中时,.
和 ?
将变为 普通字符,它就是 点 和 问号。你可以理解为 [ ]
的优先级要大于. 和 ?
的优先级。?aaa.bbb
,记住这里 . 和 ?
被完全当做了普通字符。多选结构其实就是元字符 |
(或)的使用。
界定范围:开头、结尾、小括号
正则 | 含义 | Windows98|Windows2000|WindowsXP | 匹配Windows98 或者Windows2000 或者WindowsXP | ^Windows98|Windows2000|WindowsXP$ | 以Windows98 开头或者包含Windows2000 或者以WindowsXP结尾 注意 ^ 和$ 都包含在| 的范围内,因为| 的界限只有:开头、结尾、小括号 | Windows(98|2000|XP) | Windows 然后98 或者2000 或者XP |
---|
总结:多选结构可以包括很多字符,但不能超越 括号
的界限。
(/d{1,3}/.){3}/d{1,3}
简单的 IP 地址匹配表达式((2[0-4]/d|25[0-5]|[01]?/d/d?)/.){3}(2[0-4]/d|25[0-5]|[01]?/d/d?)
左括号
为标志,从左向右,第一个分组的组号为 1 ,第二个为 2 ,依次类推。示例:
/b(/w+)/b/s+/1/b
可以用来匹配重复的单词where where go, tom tom happy
直白解释:
正则表达式中,前面用小括号进行划分(分组),后面把小括号匹配到的内容引用到后面来,分别用/1
、/2
等 来表示。(第一个小括号极/1
...)。如果存在 小括号嵌套小括号的情况 (/w+(.?))
记住:这个时候要以 (
为标志 从左往右 数小括号就可以了。
/b
、^
、$
那样。环视不会占用字符。(?=exp)
位置的后面能匹配 exp
。例如:(?=/d)
当前位置右边是数字。(?!exp)
位置的后面不能匹配 exp
。例如:(?!/d)
当前位置右边不是数字。(?<=exp)
位置的前面能匹配 exp
。例如:(?<=/d)
当前位置左边是数字(?<!exp)
位置的前面不能匹配 exp
。例如:(?!/d)
当前位置左边不是数字。+
、*
、{3,12}
等)时, 通常的行为是匹配尽可能多的字符。a.*b
,它将会匹配最长的以 a
开始,以 b
结束的字符串。如果用它来搜索 aabab
的话,它会匹配整个字符串 aabab
,这被称为 -------贪婪匹配?
。这样 .*?
就意味着匹配任意数量的重复,但是在能使整个 匹配成功的前提下使用最少的重复。a.*?b
匹配最短的,以 a
开始, 以 b
结束的字符串。如果把它应用于 aabab
的话,它会匹配 aab
和 ab
。总结:
高级5 - 模式匹配的优先级贪婪与懒惰模式之间的区别就在于:懒惰模式 在量词
*
的后面多了一个 问号?
。
在使用正则表达式时,需要注意匹配的顺序。通常相同优先级 从左到右 进行计算,不同优先级的运算 先高后低。各种操作符的匹配顺序优先级 从高到低 如下表所示。
顺序 | 元字符 | 描述 | 1 | / | 转义字符 | 2 | () 、(?:) 、(?=) 、[] | 模式单元和原子表 | 3 | * 、+ 、? 、{n} 、{n,} 、{n,m} | 重复匹配 | 4 | ^ 、$ 、/b 、/B 、/A 、/Z | 边界限制 | 5 | | | 模式选择 |
---|
1问:要匹配字符串 333333/$33/33333
中的 /$
正则应该怎么写?
2问:如果在 PHP 中 preg_match
函数分别用单引号和双引号的表达式来匹配上面的 /$
,怎么写?
答案:
///$
'///////$/'
。(为方便查看我们拆分一下为 '/// // // $/'
)"////////$/"
。(为方便查看我们拆分一下为 "/// // // /$/"
)再答:
/
,所以我们需要 6个/
来生成表达式。双引号除了转义 /
以外,还需要多一个 /
用来转义 $
所以它 需要 7 个/
。
相关教程推荐:PHP视频教程
以上就是详解正则表达式的详细内容,更多请关注 其它相关文章!
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
新闻热点
疑难解答