正则表达式学习
Javascript 与正则表达式
一、正则表达式(regular expression简称res) 1、定义: 一个正则表达式就是由普通字符以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 2、作用: 正则表达式提供了功能强大、灵活而又高效的方法来处理文本。正则表达式的全面模式匹配表示法可以快速地分析大量的文本以找到特定的字符模式;提取、编辑、替换或删除文本子字符串;或将提取的字符串添加到集合以生成报告。 3、主要用途: 正则表达式被用来匹配一组文字。 通常,它有两类用途: 1. 数据有效性验证 2. 查找和替换 4、如何来构造正则表达式: 构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。可以通过在一对分隔符之间放入表达式模式的各种组件来构造一个正则表达式。对 JScript 而言,分隔符为一对正斜杠 (/) 字符。 ? 构造器函数方法使用方法如下: new RegExp("pattern"[,"flags"]) ? 文本格式: /pattern/flags 参数说明: pattern :一个正则表达式文本 flags : 如果存在,将是以下值: g : global match(全局匹配) i :ignore case(忽略大小写) gi : both global match and ignore case(匹配所有可能的值,也忽略大小写) 注意:文本格式中的参数不要使用引号标记,而构造器函数的参数则要使用引号标记。所以下面的 表达式建立同样的正则表达式:/ab+c/i 等价于 new RegExp("ab+c","i") 使用 文本格式 文本的长度最大支持128个字符, 描述: 当使用构造函数的时候,必须使用正常的字符串避开规则(在字符串中加入前导字符 )是必须的。 例如,下面的两条语句是等价的: re = new RegExp("w+") re = /w+/ 二、下表是元字符及其在正则表达式上下文中的行为的一个完整列表: 字 符 描 述 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'n' 匹配一个换行符。序列 '' 匹配 "" 而 "(" 则匹配 "("。 ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 'n' 或 'r' 之后的位置。 $ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 'n' 或 'r' 之前的位置。 * 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。 + 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 ? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {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{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 ? 当该字符紧跟在任何一个其他限制符 (*,+,?,{n},{n,},m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。 . 匹配除 "n" 之外的任何单个字符。要匹配包括 'n' 在内的任何字符,请使用象 '[.n]' 的模式。 (pattern) 匹配pattern 并获取这一匹配。在JScript 中则使用 $1…$9 属性。要匹配圆括号字符,请使用 '(' 或 ')'。 (?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。 (?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 (?!pattern) 负向预查,在任何不匹配的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 x|y 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 [xyz] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。 [^xyz] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。 [a-z] 字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。例如:[a-z] [A-Z] [0-9] [^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。 b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'erb' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 B 匹配非单词边界。'erB' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 cx 匹配由x指明的控制字符。例如, cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 d 匹配一个数字字符。等价于 [0-9]。 D 匹配一个非数字字符。等价于 [^0-9]。 f 匹配一个换页符。等价于 x0c 和 cL。 n 匹配一个换行符。等价于 x0a 和 cJ。 r 匹配一个回车符。等价于 x0d 和 cM。 s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ fnrtv]。 S 匹配任何非空白字符。等价于 [^ fnrtv]。 t 匹配一个制表符。等价于 x09 和 cI。 v 匹配一个垂直制表符。等价于 x0b 和 cK。 w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如, 'x41' 匹配 "A"。'x041' 则等价于 'x04' & "1"。正则表达式中可以使用 ASCII 编码。. num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)1' 匹配两个连续的相同字符。 n 标识一个八进制转义值或一个后向引用。如果 n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。 nm 标识一个八进制转义值或一个后向引用。如果 nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 nm 将匹配八进制转义值 nm。 nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。 un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, u00A9 匹配版权符号 (?)。 三、正则表达式的常用方法: regexp.test(string) 用来测试一个字符串是否能够被匹配。它返回ture或false两个值。 regexp.exec(string) 在指定的字符串中执行搜寻一个匹配,匹配的结果是通过一个数组返回。 四、与正则表达式有关的字符串对象的方法: string.replace(pattern,string) 替换在正则表达式查找中找到的文本。 string.search(pattern) 通过正则表达式查找相应的字符串,只是判断有无匹配的字符串。如果查找成功,search返回匹配串的位置, 否则返回-1。 string.match(pattern) match方法执行全局查找,查找结果存放在一个数组里。 五、常用的正则表达式的操作符 Symbol Function 转义符 (),(?:),(?=),[] 括号 *,m} 限定符 ^,$,anymetacharacter 定位符 | 或 八、一些常用的正则表达式示例: 1、匹配所有的正数:^[0-9]+$ 2、匹配所有的小数:^-?[0-9]*.?[0-9]*$ 3、匹配所有的整数:^-?[0-9]+$ 4、提取信息中的中文字符串: [u4e00-u9fa5]* ; 5、提取信息中的邮件地址:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 6、提取信息中的中国手机号码:(86)*0*13d{9} 7、提取信息中的中国固定电话号码:((d{3,4})|d{3,4}-|s)?d{8} 8、提取信息中的中国邮政编码:[1-9]{1}(d+){5} 9、提取信息中的中国身份证号码:d{18}|d{15} 10、提取信息中的任何数字:(-?d*)(.d+)? 11、匹配HTML标记的正则表达式:/<(.*)>.*</1>|<(.*) />/ 则表达式用于字符串处理、表单验证等场合,实用高效。 现将一些常用的表达式收集于此,以备不时之需。 匹配中文字符的正则表达式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在 内):[^x00-xff] 评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 匹配空白行的正 则表达式:ns*r 评注:可以用来删除空白行 匹配HTML标记的正则表达式:<(S*?) [^>]*>.*?</1>|<.*? /> 评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对 于复杂的嵌套标记依旧无能为力 匹配首尾空白字符的正则表达式:^s*|s*$ 评注:可以用来删除行首行尾的空白字符(包括空 格、制表符、换页符等等),非常有用的表达式 匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.] w+)*.w+([-.]w+)* 评注:表单验证时很实用 匹配网址URL的正则表达式:[a-zA- z]+://[^s]* 评注:网上流传的版本功能很有限,上面这个基本可以满足需求 匹配帐号是否合法(字母开头,允许5-16 字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 评注:表单验证时很实用 匹配国内电话号 码:d{3}-d{8}|d{4}-d{7} 评注:匹配形式如 0511-4405222 或 021-87888822 匹 配腾讯QQ号:[1-9][0-9]{4,} 评注:腾讯QQ号从10000开始 匹配中国邮政编码:[1-9]d{5}(?! d) 评注:中国邮政编码为6位数字 匹配身份证:d{15}|d{18} 评注:中国的身份证为15位或18位 匹 配ip地址:d+.d+.d+.d+ 评注:提取ip地址时有用 匹配特定数字: ^[1-9]d*$ //匹配正整数 ^-[1-9]d*$ //匹配负整数 ^-?[1-9]d*$ //匹配整数 ^[1-9]d*|0$ //匹配非负整数(正整数 + 0) ^-[1-9]d*|0$ //匹配非正整数(负整数 + 0) ^[1-9]d*.d*|0.d*[1-9]d*$ //匹配正浮点数 ^-([1-9]d*.d*|0.d*[1-9]d*)$ //匹配负浮点数 ^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$ //匹配浮点数 ^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$ //匹配非负浮点数(正浮点 数 + 0) ^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$ //匹配非正浮点数(负浮点 数 + 0) 评注:处理大量数据时有用,具体应用时注意修正 匹配特定字符串: ^[A-Za-z]+$ //匹配由26 个英文字母组成的字符串 ^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串 ^[a-z]+$ //匹配由26个英文字母 的小写组成的字符串 ^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串 ^w+$ //匹配由数字、26个 英文字母或者下划线组成的字符串 评注:最基本也是最常用的一些表达式 加了时间验证的 ^((((1[6-9]|[2-9]d)d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]d|3[01]))|(((1[6-9]|[2-9]d)d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]d|30))|(((1[6-9]|[2-9]d)d{2})-0?2-(0?[1-9]|1d|2[0-8]))|(((1[6-9]|[2-9]d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)) (20|21|22|23|[0-1]?d):[0-5]?d:[0-5]?d$
注意在php正则表达式中记住要最外层要用双引号,还有就是要有定界符
网上有很多的已经写好的正则表达式,如果电话号码,url等,有事没事多看看。
正则表达式就是描述字符串排列模式的一种自定义语法规则。
如果能使用字符串处理函数就不要使用正则表达式,但是有些复杂的操作只能使用正则表达式。因为正则表达式在处理有很多信息的时候会大幅度降低速度,所以我们建议能用字符串处理函数就用字符串处理函数,而不用正则表达式。
正则表达式也称为一种模式表达式。
正则表达式就是通过构建具有特定规则的模式,与输入的字符信息比较,在进行分割,匹配,查找,替换等工作。
如果正则表达式不和函数使用,则他就是一个字符串,如果将正则表达式放入函数中才能发挥出他的作用。用到分割函数中,就可以用这个正则去分割字符串,用到替换函数中就可以去替换字符串。
在php中为我们提供两套正则表达式函数库:
Posix扩展正则表达式函数,通常是以ereg开头
Perl兼容正则表达式函数,通常是以preg开头
这两个函数库功能一样,推荐使用处理字符串效率较高的Perl兼容正则表达式,Perl兼容正则表达式是后期php加进去的并且能够与大多数语言兼容
语法:
格式:"/原子和元字符/模式修正符" 注意:/为定界符号(
有些语言是不需要定界符号的)
“/&;imgs*src=".*?"/&;/iu”
1.定界符号
反斜线//。 除了字母,数字和正斜线,以外的任何字符都可以为定界符号。一般情况
下,没有特殊需要我们都用反斜线作为正则的定界符号
2.原子 img s .
注意:原子是正则表达式的最基本的组成单位,而且只要是正则表达式,就必须至少要包含一个原子。只要一个正则表达式可以单独使用的字符,就是原子。
包含所有打印(所有可以在屏幕上输出的字符)和非打印字符(看不到的,如回车,空格)。
(1) * . + ? ( <> 如果所有有意义的字符,想作为原子使用,统统使用""转义字符转义,假如一个字符是可以不转义的,但是转义之后 也是没有错的。
转义字符可以将有意义的字符转义成没有意义的字符,将没有意义的字符转义成有意义的字符。
(2)在正则表达式中可以直接使用一些代表范围的原子
(3)自已定义一个原子表[],可以匹配方括号中任何一个原子[13579]表示匹配奇数,注意这里如果去掉中括号,则表示匹配13579这个 字符串,意义是完全不同的。
[a-z5-7]-表示匹配一段范围,包括a,z以及5,7。
[^]表示取反,就是除了原子表中的原子。(注意^必须在[]内的第一个字符处出现)。如:[^a-z],[^abc]。
3.元字符 * ?
元字符是一种特殊的字符,是用来修饰原子用的,不可以单独出现
*: 表示其前的原子可以出现0次,1次,多次
+:表示其前的原子至少要出现一次
?:表示其前的原子可以出现0次或者1次,有只能由一次
.:默认情况下,表示除换行符外,任意一个字符
|:表示或的关系,它的优先级别是最低的,最后考虑他的功能,/cat|dog/,因为优先级别最低,所以是cat或者dog而不是t或者d
{}:用于自己定义前面原子出现次数。{5}表示前面的原子出现5次,{2,4}最少2次,最多4次,包括2和4。{5,}表示最少出现5次,最多出现无数次
^:直接在一个正则表达式的第一个字符出现,则表示必须以这个正则表达式开始
$:直接在一个正则表达式的最后一个字符出现,则表示必须以这个正则表达式结束
以one开头并且是以one结尾的,/^one$/这是错误的,/^one.*one$/这是正确的
b:表示一个边界,这里边界我个人认为是指的是空格
B:表示一个非边界
():重点学习:
1.()表示作为大原子使用,如/abc+/和/(abc)+/的区别
2.改变优先级
3.作为子模式使用,正则表达式不先对一个字符串匹配一次,全部匹配作为一个大模式,放到数组的第一个元素中,每一个()时一个子模式按顺序放到数组的其他元素中。
4.可以取消子模式,就将()作为大原子或者改变优先级使用,在括号中最前面使用“?:”就可以取消这个括号表示的子模式
5.反向引用:可以在模式中直接将子模式取出来,再作为正则表达式模式的一部分,如果是在正则表达式像替换函数preg_replace函数中,可以将子模式取出,在被替换的字符串中使用
1取出第一个子模式,2取出第二个子模式(注意单引号和双引号引起来的区别)“1” '1'
注意在双引号中可以解释转义字符,而在单引号中则不能解释转义字符,所以个人认为当写正则表达式的时候要写双引号。
4.模式修正符号 i u,
注意在有些语言中是不支持模式修正符的,如JavaScript。
“/ /模式修正符号”
1.就是几个字母
2.可以一次使用一个,每一个具有一定的意义,也可以连续使用多个
3.是对整个正则表达式调优使用的,,也可以说是对正则表达式功能的扩展
例子:“/abc/” “/abc/i”
i:表示在和模式进行匹配时不区分大小写
m:默认情况下,将字符串视为一行,使用^ $,当为多行时,任何一行都可以以正则开始或结束
s:将字符串视为单行。如果没有使用这个模式修正符,元字符中“.”默认不能表示换行符。加上之后“.”就可以表示所有的符号了。
x:表示模式中的空白忽略不计。
e:正则表达式必须使用preg_replace替换字符串时才可以使用(学习这个函数时候,在详细了解)
A:必须以什么开始,与^作用一样
Z:必须以什么结尾,与$作用一样
U:正则表达式有贪婪的特点,通过U可以取消这种贪婪的特点
正则表达式是有贪婪模式的 ,如 .* .+; 如果想要取消这种贪婪模式方法一:添加模式修正符U,方法二:(.*?),注意这两种方式是排斥的,即有负负的正的效果,如果都有则是开启贪婪模式
Perl兼容的正则表达式函数:
preg_match():
preg_match_all():
preg_replace():
1.正常使用 preg_replace(string,string,string);
例如:$str2="我dd相信我就hdf是我就是dh明天,";
echo preg_replace("/[a-z]+/","000",$str2);
注意:+的有和没有是有很大的不同的
preg_replace("/[a-z]+/",$str2,3,$count);
注意:这里的第四个参数与str_replace();是不同的,这里是限制其替换的次数,最后一个参数和str_place();的第四个参数是相同的
2.在正则中的子模式,可以用到第二个参数中。可以使用${1}或者1
如:preg_replace("/([a-z]+)/",'<font color="blue">${1}</font>',$str2);
3.在第二个参数中调用函数,需要在模式中使用e模式修正符
如:preg_replace("/([a-z]+)/e",'strtoupper(${1})',$str2);
preg_replace("/([a-z]+)/e",'"<font color="red">"'.'.strtoupper(${1}).'.'"</font>"',$str2);
4.就是在前两个参数中都使用数组,可以一起将多个模式(正则)同时替换成多个值的形式
preg_split();
当按一个特定的字符去分割的时候,就使用explode();当按一种模式去分割的时候就用正则表达式中的 分割函数
preg_grep(string,array);
preg_grep(string,array,PREG_GREP_INVERT);
preg_quote();转义正则表达式字符 ;
例如:在我们不确定那些需要加上的时候,可以借助这个函数进行帮助。
注意在php正则表达式中记住要最外层要用双引号,还有就是要有定界符
网上有很多的已经写好的正则表达式,如果电话号码,url等,有事没事多看看。
正则表达式就是描述字符串排列模式的一种自定义语法规则。
如果能使用字符串处理函数就不要使用正则表达式,但是有些复杂的操作只能使用正则表达式。因为正则表达式在处理有很多信息的时候会大幅度降低速度,所以我们建议能用字符串处理函数就用字符串处理函数,而不用正则表达式。
正则表达式也称为一种模式表达式。
正则表达式就是通过构建具有特定规则的模式,与输入的字符信息比较,在进行分割,匹配,查找,替换等工作。
如果正则表达式不和函数使用,则他就是一个字符串,如果将正则表达式放入函数中才能发挥出他的作用。用到分割函数中,就可以用这个正则去分割字符串,用到替换函数中就可以去替换字符串。
在php中为我们提供两套正则表达式函数库:
Posix扩展正则表达式函数,通常是以ereg开头
Perl兼容正则表达式函数,通常是以preg开头
这两个函数库功能一样,推荐使用处理字符串效率较高的Perl兼容正则表达式,Perl兼容正则表达式是后期php加进去的并且能够与大多数语言兼容
语法:
格式:"/原子和元字符/模式修正符" 注意:/为定界符号(
有些语言是不需要定界符号的)
“/&;imgs*src=".*?"/&;/iu”
1.定界符号
反斜线//。 除了字母,数字和正斜线,以外的任何字符都可以为定界符号。一般情况
下,没有特殊需要我们都用反斜线作为正则的定界符号
2.原子 img s .
注意:原子是正则表达式的最基本的组成单位,而且只要是正则表达式,就必须至少要包含一个原子。只要一个正则表达式可以单独使用的字符,就是原子。
包含所有打印(所有可以在屏幕上输出的字符)和非打印字符(看不到的,如回车,空格)。
(1) * . + ? ( <> 如果所有有意义的字符,想作为原子使用,统统使用""转义字符转义,假如一个字符是可以不转义的,但是转义之后 也是没有错的。
转义字符可以将有意义的字符转义成没有意义的字符,将没有意义的字符转义成有意义的字符。
(2)在正则表达式中可以直接使用一些代表范围的原子
(3)自已定义一个原子表[],可以匹配方括号中任何一个原子[13579]表示匹配奇数,注意这里如果去掉中括号,则表示匹配13579这个 字符串,意义是完全不同的。
[a-z5-7]-表示匹配一段范围,包括a,z以及5,7。
[^]表示取反,就是除了原子表中的原子。(注意^必须在[]内的第一个字符处出现)。如:[^a-z],[^abc]。
3.元字符 * ?
元字符是一种特殊的字符,是用来修饰原子用的,不可以单独出现
*: 表示其前的原子可以出现0次,1次,多次
+:表示其前的原子至少要出现一次
?:表示其前的原子可以出现0次或者1次,有只能由一次
.:默认情况下,表示除换行符外,任意一个字符
|:表示或的关系,它的优先级别是最低的,最后考虑他的功能,/cat|dog/,因为优先级别最低,所以是cat或者dog而不是t或者d
{}:用于自己定义前面原子出现次数。{5}表示前面的原子出现5次,{2,4}最少2次,最多4次,包括2和4。{5,}表示最少出现5次,最多出现无数次
^:直接在一个正则表达式的第一个字符出现,则表示必须以这个正则表达式开始
$:直接在一个正则表达式的最后一个字符出现,则表示必须以这个正则表达式结束
以one开头并且是以one结尾的,/^one$/这是错误的,/^one.*one$/这是正确的
b:表示一个边界,这里边界我个人认为是指的是空格
B:表示一个非边界
():重点学习:
1.()表示作为大原子使用,如/abc+/和/(abc)+/的区别
2.改变优先级
3.作为子模式使用,正则表达式不先对一个字符串匹配一次,全部匹配作为一个大模式,放到数组的第一个元素中,每一个()时一个子模式按顺序放到数组的其他元素中。
4.可以取消子模式,就将()作为大原子或者改变优先级使用,在括号中最前面使用“?:”就可以取消这个括号表示的子模式
5.反向引用:可以在模式中直接将子模式取出来,再作为正则表达式模式的一部分,如果是在正则表达式像替换函数preg_replace函数中,可以将子模式取出,在被替换的字符串中使用
1取出第一个子模式,2取出第二个子模式(注意单引号和双引号引起来的区别)“1” '1'
注意在双引号中可以解释转义字符,而在单引号中则不能解释转义字符,所以个人认为当写正则表达式的时候要写双引号。
4.模式修正符号 i u,
注意在有些语言中是不支持模式修正符的,如JavaScript。
“/ /模式修正符号”
1.就是几个字母
2.可以一次使用一个,每一个具有一定的意义,也可以连续使用多个
3.是对整个正则表达式调优使用的,,也可以说是对正则表达式功能的扩展
例子:“/abc/” “/abc/i”
i:表示在和模式进行匹配时不区分大小写
m:默认情况下,将字符串视为一行,使用^ $,当为多行时,任何一行都可以以正则开始或结束
s:将字符串视为单行。如果没有使用这个模式修正符,元字符中“.”默认不能表示换行符。加上之后“.”就可以表示所有的符号了。
x:表示模式中的空白忽略不计。
e:正则表达式必须使用preg_replace替换字符串时才可以使用(学习这个函数时候,在详细了解)
A:必须以什么开始,与^作用一样
Z:必须以什么结尾,与$作用一样
U:正则表达式有贪婪的特点,通过U可以取消这种贪婪的特点
正则表达式是有贪婪模式的 ,如 .* .+; 如果想要取消这种贪婪模式方法一:添加模式修正符U,方法二:(.*?),注意这两种方式是排斥的,即有负负的正的效果,如果都有则是开启贪婪模式
Perl兼容的正则表达式函数:
preg_match():
preg_match_all():
preg_replace():
1.正常使用 preg_replace(string,string,string);
例如:$str2="我dd相信我就hdf是我就是dh明天,";
echo preg_replace("/[a-z]+/",$str2);
注意:+的有和没有是有很大的不同的
preg_replace("/[a-z]+/",$count);
注意:这里的第四个参数与str_replace();是不同的,这里是限制其替换的次数,最后一个参数和str_place();的第四个参数是相同的
2.在正则中的子模式,可以用到第二个参数中。可以使用${1}或者1
如:preg_replace("/([a-z]+)/",$str2);
3.在第二个参数中调用函数,需要在模式中使用e模式修正符
如:preg_replace("/([a-z]+)/e",$str2);
preg_replace("/([a-z]+)/e",$str2);
4.就是在前两个参数中都使用数组,可以一起将多个模式(正则)同时替换成多个值的形式
preg_split();
当按一个特定的字符去分割的时候,就使用explode();当按一种模式去分割的时候就用正则表达式中的 分割函数
preg_grep(string,array);
preg_grep(string,PREG_GREP_INVERT);
preg_quote();转义正则表达式字符 ;
例如:在我们不确定那些需要加上的时候,可以借助这个函数进行帮助。
正则表达式的奥秘
1,正则表达式简介 (1)什么是正则表达式:是使用某种模式去匹配一类字符串的公式,它主要用于字符串的校验,分割,查找及替换操作。 (2)正则表达式的作用:替换文本或者代码中的某些字符,编辑软件无法完成的查找和替换,可以使用正则表达式来完成几乎全部的文本查找和替换工作。 正则表达式的强大功能源于它可以指定抽象模式来校验许多不同的字符序列。可以这定3种基本的抽象模式: 1.可以出现的字符集 (如:字母,数字和下划线) 2.可选择行的集合 (如:“com”,“net”或“org”) 3.可重复的序列 (如:自少一个短时不多于8个字母字符) (将这3种模式按照不同的方式结合,就可以校验用户输入的电子右键地址格式是否正确;校验用户输入的日期格式是否正确;校验用户输入的身份证号格式是否正确等等 ) 2,正则表达是基础 (1)元字符:正则表达式由一些普通字符和一些元字符(metacharacters)共同组成,其中普通字符包括大小写的字母和数字,而元字符则具有特殊含义。 元字符是用来描述其前面的字符在匹配模式中出现的方式。元字符本身是单一的字符,但是不同或者相同的元字符组合起来可以构成大的元字符。表中介绍各元字符的含义
正则表达式的语法是严格区分大小写的。 (2)方括号表达式:可以用来定义一个字符集合,其含义是必须匹配该集合中的任意一个字符,定义方括号表达式的方式有一下两种: 1.把所有的字符都列出阿来。 例如:方括号表达式”[1234567890]“可以与任何数字字符匹配,但是只能匹配一个字符。 2.利用字符”—“来表示字符区间。 例如:方括号表达式”[0123456789abcdefABCDEF]“ 可以简写成方括号表达式”[0-9a-fA-F]“。 (通常情况下,字符”-“都只是一个普通字符,只有在表达范围时才被作为元字符来使用。如:方括号表达式[-a-z]的第一个字符”-“只代表一个普通字符,而第二个是一个元字符。 用来表示字母a到z的范围里) 常用的方括号表达式:
(3)定位符:方括号表达式只能用来匹配一个字符,如“Y8”、“B3”、“A6”等。这里就需要使用定位符“^”与“$” 定位符是用来描述字符串或单词的边界的,具体包括^("shift+6组合键")和$(美元符号)它们含义分别为在字符传的开始匹配和在结尾匹配。 灵活使用定位符和方括号可以完成功能不同的正则表达式。 如:“^[A-Z][0-9]$”可以用来校验由两个字符组成的字符串,并且该字符串要同时满足 以大小写字母字符开头,以数字结尾的条件。 元字符“^”如果出现在方括号表达式的里面,表示含义为否;如果出现在方括号外面,表示含义为字符串的开始。 (4)量词:也称为限定符,用来指定字符必须要出现的次数,也就是说在指定重复模式时要使用量词。 量词具体包括*、+、?、{n}、{n,}、{n,m}共6种使用见表所示:
使用量词可以指定在一次搜索中查找到一个表达式的次数,如:正则表达式“sung{1,2}”可以用来校验任何字符串“sung”和“sungsung” 量词“?”如果出现在方括号里面也一样代表一个普通字符。如:“[-0-9?]”可以用来校验任何一个数字或者一个普通字符"?"或者一个普通字符“-”。 (5)选择符:正则表达式中竖线“|”可以表示选择分支。如:正则表达式“aaa|bbb|ccc”可以用来校验字符串“aaa”,字符串“bbb”,或“ccc”。 使用选择与其他元字符结合可以完成更复杂的正则表达式 如:正则表达式“^[0-9]|[a-z]”可以用来校验数字或字母字符开头。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |