正则表达式中所有的字母字符和数字都是按照直接量与自身相匹配,
javascript的正则表达式语法还通过以反斜杠(/)开头的转义序列支持某些非字母的字符。例如”\n”在字符串中匹配的是直接量换行符
字符 | 匹配 |
---|---|
字母数字字符 | 自身 |
\o | NUL字符 |
\t | 制表符 |
\n | 换行符 |
\v | 垂直制表符 |
\f | 换页符 |
\r | 回车 |
\xnn | 由十六进制数nn指定的拉丁字符 |
\uxxxx | 由十六进制数xxxx指定的Unicode字符 |
\cX | 控制字符^X。例如,\cJ等价与换行符\n |
在正则表达式中,许多字符都有特殊含义,他们是:
^ $ . * + ? = ! : | \ / ( ) [ ] { }
字符类
将单独的直接量字符放进方括号内就可以组合成字符类。一个字符类
和它所包含的任何字符都匹配。所以正则表达式/[abc]/就和字
母”a”,”b”,”c”中的任何一个字母都匹配。另外,还可以定义否定
字符类,这些类匹配的是不包含在方括号之内的所有字符。定义否定字
符类的时候,要将一个^符号作为左方括号后的第一个字符。正则表达
式/[^abc]/匹配的是”a”,”b”,”c”之外的所有字符。字符类可以
使用连字符来表示一个字符范围。要匹配拉丁字母集中的任何小写字
符,可以使用/[a-z]/,要匹配拉丁字母集中任何字母数字字符,则使
用/[a-zA-Z0-9]/。
字符 | 匹配 |
---|---|
[…] | 位于括号之内的任意字符 |
[^…] | 不在括号之中的任意字符 |
. | 除换行符和其他Unicode行终止符之外的任意字符 |
\w | 任何Ascll单字字符,等价于[a-zA-Z0-9_] |
\W | 任何非Ascll单仔仔符,等价于[^a-zA-Z0-9_] |
\s | 任何Unicode空白符 |
\S | 任何非Unicode空白符的字符 |
\d | 任意Ascll数字,等价于[0-9] |
\D | 除了Ascll数字之外的任意字符,等价于[^0-9] |
字符 | 含义 |
---|---|
{n,m} | 匹配前一项至少n次,但是不能超过m次 |
{n,} | 匹配前一项n次,或更多次 |
{n} | 匹配前一项恰好n次 |
? | 匹配前一项0次或1次,也就是说前一项是可选 |
+ | 匹配前一项1次或多次 |
* | 匹配前一项0次或多次 |
下面我们就来举例说明:
a=’a2b3c123dfg’
a.match(/\d{2,4}/) // [“123”]
从字面上理解就是匹配(\d任意数字)->({2,3}最少2次,最多3次). 也就是
说在字符串中找到连续的数字条件是最少2个在意,最多三个。那如果
我们改成这样a.match(/\d{4,5}/),结果就为”null”应为a字符串里没有超过4个数字在一起的。那如果 a.match(/\d{1,1}/) ,结果它会输出字符串里从做到右第一个满足条件的,那就是第一个”2”.
a=’ a2b323c123dfg’
a.match(/\w{3}\d?/) // ["a2b3"]
从字面上理解(\w表示任意ascll字符),({3}匹配正好3次),(\d再匹配任意数字),(?匹配一个或没有)。如果我们这样a.match(/\w{3}\d*/) //结果为["a2b323"]
a='123abc java 2df3'
a.match(/\s+java\s+/) // [" java "]
把”java”找出来,且”java”前后必须有一个或多个空格
正则表达式的语法还包括制定的选择项,对字表达式分组和引用前一子表达式的特殊字符,字符“|“用于分隔供选择的字符。例如,/ab|cd|ef/匹配的是字符串“ab”,或者是字符串“cd”,又或是字符串“ef”。/\d{3}[a-z]{4}/匹配的是三位数字或四个小写字母。
注意,选择项是从左至右考虑,直到发现了匹配项。如果左边的选择项匹配,就忽略右边的匹配项,即使它产生更好的匹配。因此,把模式/a|ab/应用到字符串“ab”上时,它只是匹配第一个字符。
在正则表达式中括号的一个作用是把单独的项目组合成子表达式,以便可以像处理一个独立的单元那样用|,*,+或?等来处理它们。例如,/(ab|cd)+|er)/匹配的既可以是字符串“ef”,也可以是字符串“ab”或者是“cd”的一次或多次重复。
在正则表达式中,括号的另一个作用是在完整的模式中定义子模式。当一个正则表达式成功的和目标字符串相匹配时,亦可以从目标传中抽取和括号中的资模式相匹配的部分。例如,假定我们正在检索的模式是一个或多个小写字母后面跟随的了一位或多位数字,则可以使用模式/[a-z]+\d*/。但是嘉定我们真正关心的是每个匹配末尾的数字,那么如果将模式的数字部分放在括号中(/[a-z]+(\d)/),就可以从所检索到的任何匹配中抽取数字了。
带括号的子表达式的另一个用途是允许我们在同一正则表达时的后面引用前面的字表达式。这是通过在字符“\”后加一位或多位数字实现的。
/([‘”])[^’”]*\1/
这里\1匹配的是第一个带括号的字表达式所匹配的模式。在这个例子中,它实施了一条约束,那就是开始的引号必须和结束的引号相匹配。正则表达式不允许用双引号括起来的字符串中的引号,反之依然。在字符类中使用引用是不合法的,所以我们不能编写:
/([‘”])[^\1]*\1/
字符 | 含义 |
---|---|
| | 选择。匹配的是该符号左边的字表达式或右边的子表达式 |
(…) | 组合。将几个项目组合为一个单元,这个单元可由*,+,?和|等符号使用,而且还可以记住和这个组合匹配的字符以供伺候的引用使用 |
(? : …) | 只组合。把项目组合到一个单元,但是不记忆与该组匹配的字符 |
\n | 和第n个分组第一册匹配的字符相匹配。组是括号中的字表达式 |
字符 | 含义 |
---|---|
^ | 匹配字符串的开头,在多行检索中,怕匹配一行的开头 |
$ | 匹配字符串的结尾,在多行检索中,匹配一行的结尾 |
\b | 匹配一个语句的边界。简而言之,就是位于字符\w和\W之间的位置,或位于字符\w和字符串的开头或结尾之间的位置 |
\B | 匹配非词语边界的位置 |
(?=p) | 正前向声明,要求接下来的字符都与模式p匹配,但是不包括匹配中的那些字符 |
(?!p) | 反前向声明,要求接下来的字符不与模式p匹配 |
例如,要匹配一种常用的程序设计语言的名字,但只在其后有冒号时匹配,可以使用/[Jj]ava([Ss]cript)?(?=\:)/ 这个模式与“JavaScript: The Definitive Guide”中的单字“JavaScript”匹配,但是与“Java in a Nutshell”中的”Java”不匹配,因为其后没有冒号
正则表达式的语法还有最后一个元素,即在正则表达式的标志,它说明高级模式匹配的规则。和其他的正则表达式语法不同,标志是在“/”符号之外说明的,即它们不出现在两个斜杠之间,而是位于第二个斜杠之后。
例如,要执行一个不区分大小写的检索以找到单字“java”(或者是“Java”,”JAVA”等)的第一次出现,可以使用不区分大小写的正则表达式/\bjava\b/i。如果要在一个字符串中找到所有出现的“java”,需要添加标志g,即/\bjava\b/gi
字符 | 含义 |
---|---|
i | 执行不区分大小写的匹配 |
g | 执行一个全局匹配,简而言之,即找到所有匹配,而不是在找到第一个之后就停止 |
m | 多行模式,^匹配一行的开头和字符串的开头,$匹配一行的结尾或字符串的结尾 |