语法
- ^ 为匹配输入字符串的开始位置。
- [0-9]+匹配多个数字, [0-9] 匹配单个数字,+ 匹配一个或者多个。
- abc$匹配字母 abc 并以 abc 结尾,为匹配输入字符串的结束位置。
- 适用于静态文本,在动态文本中很难发挥
作用:
- 测试字符串内的模式。
例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。 - 替换文本。
可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。 - 基于模式匹配从字符串中提取子字符串。
可以查找文档内或输入域内特定的文本。
规则:
- runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。
- runoob,可以匹配 runob、runoob、runoooooob 等, 号代表字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。
- colou?r 可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次、或1次)。
特殊字符
如果要查找特殊字符,需要在特殊字符前加\,以达成匹配目的。
特殊符号包含:
$ + * () . [ ? \ ^ { |
限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配,*+?{n}{n,}或{n,m}共六种。
* 匹配前面的子表达式零次或多次 + 匹配前面的子表达式一次或多次 ? 匹配前面的子表达式零次或多次 {n} n是一个非负整数,匹配确定的n次。例如'o{2}'不能匹配"bob"中的'o',但是能匹配"food"中的两个o {n,} 至少匹配n次 {n,m} n<=m,最少匹配n次,且最多匹配m次
*、+限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
定位符
定位符能够将正则表达式固定在行首或行位,也可以创建出现在一个单词内,再一个单词的开头或者结尾的正则表达式。
定位符用来描述字符串的便捷,^$分别指单词的开始与结束。\b描述单词的前或后边界,\B表示非单词边界。
^ 匹配输入字符串开始的位置,如果设置了RegExp对象的Multiline属性,^还会与\n或\r之后的位置匹配。 $ 匹配输入字符串结尾的位置,如果设置了RegExp独享的Multiline属性,$还会与\n或\r之前的位置匹配。 \b 匹配一个单词边界,即字与空格间的位置 \B 非单词边界匹配
注意:
- 不能将限定符与定位符一起使用,由于在紧靠换行或者单词边界的前面或后面不能有一个以上的位置,因此不允许诸如^*之类的表达式。
- 若要匹配一行文本开始处的文本,请在正则表达式的开始使用^,不要将^的这种用法与中括号表达式内的用法混淆。
- 若要匹配一行文本的结束处的文本,请在正则表达式的结果处使用$字符。
- 若要在搜索章节标题时使用定位点,下面的郑泽表示匹配一个章节标题,该标题质保函两个尾随数字,并且出行首:
/^Chapter [1-9][0-9]{0,1}/
真正的章节标题不仅出现在行的开始出,而且它还是该行中仅有的文本,它既出现在行首又出现在行尾,下面的表达式能确保指定的匹配只匹配章节而不匹配交叉引用,通过创建只匹配一行文本的开始和结尾的正则表达式,就可做到这一点。/^Chapter [1-9][0-9]{0,1}$/
匹配单词边界稍有不同,但向正则表达式添加了很重的能力,单词边界是单词和空格之间的位置,非单词边界是任何其他位置,下面的表达式匹配单词Chapter的开头三个字符,因为这三个字符出现在单词便捷后面:/\bCha/
\b字符的位置非常重要,如果位于要匹配字符串的开始,它在单词的开始出查找匹配项,如果它位于字符串的结尾,它在单词的结尾处查找匹配项,例如,下面的表达式匹配单词Chapter的字符串ter,因为它出现在单词边界的前面:/ter\b/
下面的表达式匹配Chapter中字符串apt,但不匹配aptitude中的字符串apt:/\Bapt/
字符串apt出现在单词Chapter中的非单词边界处,但出现在单词aptitude中的单词边界出,对于/B费单词边界运算符,位置并不重要,因为匹配不关心究竟是单词的开头还是结尾。
选择
用圆括号将所有选择项括起来,相邻的选择项之间用|分割。但用圆括号有一个副作用,使相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。
其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。
反向引用
对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储,缓冲区编号从1开始,最多可存储99个捕获的子表达式。每个缓冲区都可以使用\n访问,其中n为一个标识特定缓冲区的一位或两位十进制数。
可以使用非捕获元字符?:、?=或?!来重写捕获,忽略对相关匹配的保存。
反向引用的最简单、最有用的应用之一,是提供查找文本中两个相同的相邻单词的匹配项的能力,例:
Is is the cost of of gasoline going up up?
上面的句子很显然有多个重复的单词,如果能设计一种方法定为该句子,而不必查找每个单词的重复出现,那该有多好,下面的正则表达式使用单个子表达式来实现这一点:
var str = "Is is the cost of of gasoline going up up"; var patt1 = /\b([a-z]+) \1\b/ig; document.write(str.match(patt1));
捕获的表达式,正如 [a-z]+ 指定的,包括一个或多个字母。正则表达式的第二部分是对以前捕获的子匹配项的引用,即,单词的第二个匹配项正好由括号表达式匹配。\1 指定第一个子匹配项。
单词边界元字符确保只检测整个单词。否则,诸如 "is issued" 或 "this is" 之类的词组将不能正确地被此表达式识别。
正则表达式后面的全局标记 g 指定将该表达式应用到输入字符串中能够查找到的尽可能多的匹配。
表达式的结尾处的不区分大小写 i 标记指定不区分大小写。
多行标记指定换行符的两边可能出现潜在的匹配
元字符
- \
降下一个字符标记为一个特殊字符,或一个愿意字符,或一个向后引用,或一个八进制转义符 - (pattern)
匹配pattern并获取这一匹配,所获取的匹配可以从产生的Matches集合得到 - (?:pattern)
匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用,这在使用"|(或)"字符来组合一个模式的各个部分是很有用的。 - (?=pattern)
正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,这是一个飞获取匹配,也就是说,该匹配不需要获取供以后使用例如,"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 - (?!pattern)
正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 - (?>=pattern)
反向肯定预查,例如,"(?<=95|98|NT|2000)Windows"能匹配"2000Windows"中的"Windows",但不能匹配"3.1Windows"中的"Windows"。 - (?<!pattern)
反向否定预查,例如"(?<!95|98|NT|2000)Windows"能匹配"3.1Windows"中的"Windows",但不能匹配"2000Windows"中的"Windows"。 - x|y
匹配x或y,例如,'z|food'能匹配"z"或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 - [xyz]
字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。 - [^xyz]
负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'、'l'、'i'、'n'。 - [a-z]
字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。 - [^a-z]
负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。 - \b
匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 - \B
匹配非单词边界。'er\B' 能匹配 "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
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 - \S
匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 - \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 之前至少有 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 匹配版权符号 (?)。
匹配规则
基本匹配模式
模式,是正则表达式最基本的元素,是一组描述字符串特征的字符,可以简单可以复杂。
^once
这个模式包含一个特殊的字符^,表示该模式只匹配那些以once开头的字符串,例如'once upon a time'匹配,'There once was a man from NewYork'不匹配
而$表示匹配以给定模式结尾,两者同时使用表示匹配确切字符串。如果都没有,则会与任何包含该模式的字符串匹配。
字符簇
在INTERNET的程序中,正则表达式通常用来验证用户的输入。当用户提交一个FORM以后,要判断输入的电话号码、地址、EMAIL地址、信用卡号码等是否有效,用普通的基于字面的字符是不够的。
所以要用一种更自由的描述我们要的模式的办法,它就是字符簇。
如:
- [a-z] 匹配所有的小写字母
- [A-Z] 匹配所有的大写字母
- [a-zA-Z] 匹配所有的字母
- [0-9] 匹配所有的数字
- [0-9.-] 匹配所有的数字,句号和减号
- [ \f\r\t\n] 匹配所有的白字符
同样的,这些也只表示一个字符,这是一个非常重要的。如果要匹配一个由一个小写字母和一位数字组成的字符串,比如"z2"、"t6"或"g7",但不是"ab2"、"r2d3" 或"b52"的话,用这个模式:
^[a-z][0-9]$
这个模式与"&5"、"g7"及"-2"是匹配的,但与"12"、"66"是不匹配的。下面是几个排除特定字符的例子:
- [^a-z] 除了小写字母以外的所有字符
- [^\/^] 除了()(/)(^)之外的所有字符
- [^"'] 除了双引号(")和单引号(')之外的所有字符
特殊字符.在正则表达式中用来表示除了'新行'之外的所有字符,所以模式^.5$与任何两个字符的、以数字5结尾和以其他非"新行"字符开头的字符串匹配。模式.可以匹配任何字符串,除了空串和只包含一个“新行”的字符串。
确定重复出现
到现在为止,你已经知道如何去匹配一个字母或数字,但更多的情况下,可能要匹配一个单词或一组数字。一个单词有若干个字母组成,一组数字有若干个单数组成。跟在字符或字符簇后面的花括号({})用来确定前面的内容的重复出现的次数。
^[a-zA-Z_]$ 所有字母和下划线 ^[[:alpha:]]{3}$所有的3个字母的单词 ^a$ 字母a ^a{4}$ aaaa ^a{2,4}$ aa,aaa或aaaa ^a{1,3}$ a,aa或aaa ^a{2,}$ 包含多于两个a的字符串 ^a{2,} 如:aardvark和aaab,但apple不行 a{2,} 如:baad和aaa,但Nantucket不行 \t{2} 两个制表符 .{2} 所有的两个字符
这些例子描述了花括号的三种不同的用法。一个数字 {x} 的意思是前面的字符或字符簇只出现x次 ;一个数字加逗号 {x,} 的意思是前面的内容出现x或更多的次数 ;两个数字用逗号分隔的数字 {x,y} 表示 前面的内容至少出现x次,但不超过y次。我们可以把模式扩展到更多的单词或数字:
^[a-zA-Z0-9_]{1,}$ // 所有包含一个以上的字母、数字或下划线的字符串 ^[1-9][0-9]{0,}$ // 所有的正整数 ^\-{0,1}[0-9]{1,}$ // 所有的整数 ^[-]?[0-9]+\.?[0-9]+$ // 所有的浮点数
最后一个例子
以一个可选的负号 ([-]?) 开头 (^)、跟着1个或更多的数字([0-9]+)、和一个小数点(.)再跟上1个或多个数字([0-9]+),并且后面没有其他任何东西($)。
特殊字符 ? 与 {0,1} 是相等的,它们都代表着: 0个或1个前面的内容 或 前面的内容是可选的 。所以刚才的例子可以简化为:
^\-?[0-9]{1,}\.?[0-9]{1,}$
特殊字符
- 与 {0,} 是相等的,它们都代表着 0 个或多个前面的内容 。最后,字符 + 与 {1,} 是相等的,表示 1 个或多个前面的内容 ,所以上面的4个例子可以写成:
- ```
- ^[a-zA-Z0-9_]+$ // 所有包含一个以上的字母、数字或下划线的字符串
- ^[1-9][0-9]*$ // 所有的正整数
- ^-?[0-9]+$ // 所有的整数
- ^[-]?[0-9]+(.[0-9]+)?$ // 所有的浮点数
- ```
正则表达式中[]和()区别
- 1、(abc|bcd|cde):表示这一段是abc、bcd、cde三者之一均可,顺序也必须一致。
- 2、(abc)?:表示这一组要么一起出现,要么不出现,出现则按此组内的顺序出现。
- 3、(?:abc):表示找到这样abc这样一组,但不记录,不保存到变量中,否则可以通过x取第几个括号所匹配到的项,比如:(aaa)(bbb)(ccc)(?:ddd)(eee),可以用 1 获取 (aaa) 匹配到的内容,而 3 则获取到了 (ccc) 匹配到的内容,而 4 则获取的是由 (eee) 匹配到的内容,因为前一对括号没有保存变量。
- 4、a(?=bbb):顺序环视 表示 a 后面必须紧跟 3 个连续的 b。
- 5、(?i:xxxx):不区分大小写 (?s:.*) 跨行匹配.可以匹配回车符。
- 方括号 [] 是单个匹配,字符集/排除字符集/命名字符集。
- 示例:
- 1、[0-3]:表示找到这一个位置上的字符只能是 0 到 3 这四个数字,与 (abc|bcd|cde) 的作用比较类似,但圆括号可以匹配多个连续的字符,而一对方括号只能匹配单个字符。
- 2、[^0-3]:表示找到这一个位置上的字符只能是除了 0 到 3 之外的所有字符。
- () 和 [] 有本质的区别
() 内的内容表示的是一个子表达式,() 本身不匹配任何东西,也不限制匹配任何东西,只是把括号内的内容作为同一个表达式来处理,例如 (ab){1,3},就表示 ab 一起连续出现最少 1 次,最多 3 次。如果没有括号的话,ab{1,3} 就表示 a,后面紧跟的 b 出现最少 1 次,最多 3 次。另外,括号在匹配模式中也很重要。这个就不延伸了,有兴趣可以自己查查。
[] 表示匹配的字符在 [] 中,并且只能出现一次,并且特殊字符写在 [] 会被当成普通字符来匹配。例如 [(a)],会匹配 (、a、)、这三个字符。
所以 ()、[] 无论是作用还是表示的含义,都有天壤之别。