js正则表达式解析
JavaScript的RegExp对象和String对象定义了使⽤正则表达式来执⾏强⼤的模式匹配和⽂本检索与替换函数的⽅法.
在JavaScript中,正则表达式是由⼀个RegExp对象表⽰的.当然,可以使⽤⼀个RegExp()构造函数来创建RegExp对象,也可以⽤JavaScript 1.2中的新添加的⼀个特殊语法来创建RegExp对象.就像字符串直接量被定义为包含在引号内的字符⼀样,正则表达式直接量也被定义为包含在⼀对斜杠(/)之间的字符.所以,JavaScript可能会包含如下的代码:
var pattern = /s$/;
这⾏代码创建⼀个新的RegExp对象,并将它赋给变量parttern.这个特殊的RegExp对象和所有以字母"s"结尾的字符串都匹配.⽤RegExp()也可以定义⼀个等价的正则表达式,代码如下:
var pattern = new RegExp("s$");
⽆论是⽤正则表达式直接量还是⽤构造函数RegExp(),创建⼀个RegExp对象都是⽐较容易的.较为困难的任务是⽤正则表达式语法来描述字符的模式.JavaScript采⽤的是Perl语⾔正则表达式语法的⼀个相当完整的⼦集.
正则表达式的模式规范是由⼀系列字符构成的.⼤多数字符(包括所有字母数字字符)描述的都是按照字⾯意思进⾏匹配的字符.这样说来,正则表达式/java/就和所有包含⼦串 "java" 的字符串相匹配.虽然正则表达式中的其它字符不是按照字⾯意思进⾏匹配的,但它们都具有特殊的意义.正则表达式 /s$/ 包含两个字符.
第⼀个特殊字符 "s" 是按照字⾯意思与⾃⾝相匹配.第⼆个字符 "$" 是⼀个特殊字符,它所匹配的是字符串的结尾.所以正则表达式 /s$/ 匹配的就是以字母 "s" 结尾
的字符串.
1.直接量字符
我们已经发现了,在正则表达式中所有的字母字符和数字都是按照字⾯意思与⾃⾝相匹配的.JavaScript的正则表达式还通过以反斜杠(\)开头的转义序列⽀持某些⾮
字母字符.例如,序列 "\n" 在字符串中匹配的是⼀个直接量换⾏符.在正则表达式中,许多标点符号都有特殊的含义.下⾯是这些字符和它们的含义:
正则表达式的直接量字符
字符匹配
________________________________
字母数字字符⾃⾝
\ f 换页符
\ n 换⾏符
\ r 回车
\ t 制表符
\ v 垂直制表符
\ / ⼀个 / 直接量
\ \ ⼀个 \ 直接量
\ . ⼀个 . 直接量
\ * ⼀个 * 直接量
\ + ⼀个 + 直接量
\ ? ⼀个 ? 直接量
\ | ⼀个 | 直接量
\ ( ⼀个 ( 直接量
\ ) ⼀个 ) 直接量
\ [ ⼀个 [ 直接量
\ ] ⼀个 ] 直接量
\ { ⼀个 { 直接量
\ } ⼀个 } 直接量
\ XXX 由⼗进制数 XXX 指定的ASCII码字符
\ Xnn 由⼗六进制数 nn 指定的ASCII码字符
\ cX 控制字符^X. 例如, \cI等价于 \t, \cJ等价于 \n
___________________________________________________
如果想在正则表达式中使⽤特殊的标点符号,必须在它们之前加上⼀个 "\" .
2.字符类
将单独的直接符放进中括号内就可以组合成字符类.⼀个字符类和它所包含的任何⼀个字符都匹配,所以正则表达式 / [abc] / 和字母 "a" , "b" , "c" 中的任何⼀个都匹配.另外还可以定义否定字符类,这些类匹配的是除那些包含在中括号之内的字符外的所有字符.定义否定字符尖时,要将⼀个 ^ 符号作为从左中括号算起的第⼀个字符.正则表达式的集合是 / [a-zA-z0-9] / .
由于某些字符类⾮常常⽤,所以JavaScript的正则表达式语法包含⼀些特殊字符和转义序列来表⽰这些常⽤的类.例如, \s 匹配的是空格符,制表符和其它空⽩符, \s匹配的则是空⽩符之外的任何字符.
正则表灰式的字符类
字符匹配
____________________________________________________
[...] 位于括号之内的任意字符
[^...] 不在括号之中的任意字符
. 除了换⾏符之外的任意字符,等价于[^\n]
\w 任何单字字符, 等价于[a-zA-Z0-9]
\W 任何⾮单字字符,等价于[^a-zA-Z0-9]
\s 任何空⽩符,等价于[\ t \ n \ r \ f \ v]
\S 任何⾮空⽩符,等价于[^\ t \ n \ r \ f \ v]
\d 任何数字,等价于[0-9]
\D 除了数字之外的任何字符,等价于[^0-9]
[\b] ⼀个退格直接量(特例)
________________________________________________________________
3.复制
⽤以上的正则表式的语法,可以把两位数描述成 / \ d \ d /,把四位数描述成 / \d \ d \ d \ d /.但我们还没有⼀种⽅法可以⽤来描述具有任意多数位的数字或者是⼀个
字符串.这个串由三个字符以及跟随在字母之后的⼀位数字构成.这些复杂的模式使⽤的正则表达式语法指定了该表达式中每个元素要重复出现的次数.
指定复制的字符总是出现在它们所作⽤的模式后⾯.由于某种复制类型相当常⽤.所以有⼀些特殊的字符专门⽤于表⽰它们.例如: +号匹配的就是复制前⼀模式⼀次或多次的模式.下⾯的表列出了复制语法.先看⼀个例⼦:
/\d{2, 4}/ //匹配2到4间的数字.
/\w{3} \d?/ //匹配三个单字字符和⼀个任意的数字.
/\s+java\s+/ //匹配字符串"java" ,并且该串前后可以有⼀个或多个空格.
/[^"] * / //匹配零个或多个⾮引号字符.
正则表达式的复制字符
字符含义
__________________________________________________________________
{n, m} 匹配前⼀项⾄少n次,但是不能超过m次
{n, } 匹配前⼀项n次,或者多次
{n} 匹配前⼀项恰好n次
匹配前⼀项0次或1次,也就是说前⼀项是可选的. 等价于 {0, 1}
+ 匹配前⼀项1次或多次,等价于{1,}
* 匹配前⼀项0次或多次.等价于{0,}
___________________________________________________________________
4.选择,分组和引⽤
正则表达式的语法还包括指定选择项,对⼦表达式分组和引⽤前⼀⼦表达式的特殊字符.字符| ⽤于分隔
供选择的字符.例如: /ab|cd|ef/ 匹配的是字符串 "ab",或者是字符串 "cd",⼜或者 "ef". /\d{3}|[a-z]{4}/ 匹配的是要么是⼀个三位数,要么是四个⼩写字母.在正则表达式中括号具有⼏种作⽤.它的主要作⽤是把单独的项⽬分组成⼦表达式,以便可以像处理⼀个独⽴的单元那种⽤ *、+或? 来处理那些项⽬.例如: /java(script) ?/匹配的是字符串 "java",其后既可以有 "script",也可以没有. /(ab|cd) + |ef) / 匹配的既可以是字符串 "ef",也可以是字符串"ab" 或者 "cd" 的⼀次或多次重复.
在正则表达式中,括号的第⼆个⽤途是在完整的模式中定义⼦模式。当⼀个正则表达式成功地和⽬标字符串相匹配时,可以从⽬标串中抽出和括号中的⼦模式相匹配的部分.例如,假定我们正在检索的模式是⼀个或多个字母后⾯跟随⼀位或多位数字,那么我们可以使⽤模式 / [a-z] + \ d+/.但是由于假定我们真正关⼼的是每个匹配尾部的数字,那么如果我们将模式的数字部分放在括号中 (/ [a-z] + (\d+)/) ,我们就可以从所检索到的任何匹配中抽取数字了,之后我们会对此进⾏解析的.
代括号的⼦表达式的另⼀个⽤途是,允许我们在同⼀正则表达式的后⾯引⽤前⾯的⼦表达式.这是通过在字符串 \ 后加⼀位或多位数字来实现的.数字指的是代括号的⼦表达式在正则表达式中的位置.例如: \1 引⽤的是第⼀个代括号的⼦表达式. \3 引⽤的是第三个代括号的⼦表达式.注意,由于⼦表达式可以嵌套在其它⼦表达式中,所以它的位置是被计数的左括号的位置.
例如:在下⾯的正则表达式被指定为 \2:
/
([Jj]ava([Ss]cript)) \sis \s (fun\w*) /
对正则表达式中前⼀⼦表达式的引⽤所指定的并不是那个⼦表达式的模式,⽽是与那个模式相匹配的⽂本.这样,引⽤就不只是帮助你输⼊正则表达式的重复部分的快捷⽅式了,它还实施了⼀条规约,那就是⼀个字符串各个分离的部分包含的是完全相同的字符.例如:下⾯的正则表达式匹配的就是位于单引号或双引号之内的所有字符.但是,它要求开始和结束的引号匹配(例如两个都是双引号或者都是单引号):
/[' "] [^ ' "]*[' "]/
如果要求开始和结束的引号匹配,我们可以使⽤如下的引⽤:
/( [' "] ) [^ ' "] * \1/
\1匹配的是第⼀个代括号的⼦表达式所匹配的模式.在这个例⼦中,它实施了⼀种规约,那就是开始的引号必须和结束的引号相匹配.注意,如果反斜杠后跟随的数字⽐代括号的⼦表达式数多,那么它就会被解析为⼀个⼗进制的转义序列,⽽不是⼀个引⽤.你可以坚持使⽤完整的三个字符来表⽰转义序列,这们就可以避免混淆了.例如,使⽤ \044,⽽不是\44.下⾯是正则表达式的选择、分组和引⽤字符:
字符含义
______________________________________
| 选择.匹配的要么是该符号左边的⼦表达式,要么它右边的⼦表达式
(...) 分组.将⼏个项⽬分为⼀个单元.这个单元可由 *、+、?和|等符号使⽤,⽽且还可以记住和这个组匹配的字符以供此后引⽤使⽤
\n 和第n个分组所匹配的字符相匹配.分组是括号中的⼦表达式(可能是嵌套的).分组号是从左到右计数的左括号数
______________________________________
5.指定匹配的位置
我们已经看到了,⼀个正则表达式中的许多元素才能够匹配字符串的⼀个字符.例如: \s 匹配的只是⼀个空⽩符.还有⼀些正则表达式的元素匹配的是字符之间宽度为0的空间,⽽不是实际的字符例如: \b 匹配的是⼀个词语的边界,也就是处于⼀个/w字字符和⼀个\w⾮字字符之间的边界.像\b 这样的字符并不指定任何⼀个匹配了的字符串中的字符,它们指定的是匹配所发⽣的合法位置.有时我们称这些元素为正则表达式的锚.因为它们将模式定位在检索字符串中的⼀个特定位置.最常⽤的锚元素是 ^, 它使模式依赖于字符串的开头,⽽锚元素$则使模式定位在字符串的末尾.
例如:要匹配词 "javascript" ,我们可以使⽤正则表达式 /^ javascript $/. 如果我们想检索 "java" 这个词
⾃⾝ (不像在 "javascript" 中那样作为前缀),那么我们可以使⽤模式 /\s java \s /, 它要求在词语java之前和之后都有空格.但是这样作有两个问题.第⼀: 如果 "java" 出现在⼀个字符的开头或者是结尾.该模式就不会与之匹配,除⾮在开头和结尾处有⼀个空格. 第⼆: 当这个模式到⼀个与之匹配的字符时,它返回的匹配的字符串前端和后端都有空格,这并不是我们想要的.因此,我们使⽤词语的边界 \b 来代替真正的空格符 \s 进⾏匹配. 结果表达式是 /\b java \b/.
下⾯是正则表达式的锚字符:
字符含义
____________________________________________________________________
^ 匹配的是字符的开头,在多⾏检索中,匹配的是⼀⾏的开头
$ 匹配的是字符的结尾,在多⾏检索中,匹配的是⼀⾏的结尾
\b 匹配的是⼀个词语的边界.简⽽⾔之就是位于字符\w 和 \w之间的位置(注意:[\b]匹配的是退格符)
\B 匹配的是⾮词语的边界的字符
_____________________________________________________________________
6.属性
有关正则表达式的语法还有最后⼀个元素,那就是正则表达式的属性,它说明的是⾼级模式匹配的规则.和其它正则表达式语法不同,属性是在 / 符号之外说明的.即它们不出现在两个斜杠之间,⽽是位于第⼆个斜杠之后.javascript 1.2⽀持两个属性.属性 i 说明模式匹配应该是⼤⼩写不敏感的.属性 g 说明模式匹配应该是全局的.也就是说,应该出被检索的字符串中所有的匹配.这两种属性联合起来就可以执⾏⼀个全局的,⼤⼩写不敏感的匹配.
例如: 要执⾏⼀个⼤⼩不敏感的检索以到词语 "java" (或者是 "java" 、"JAVA"等) 的第⼀个具体值,我们可以使⽤⼤⼩不敏感的正则表达式 /\b java\b/i .如果要在⼀个字符串中到 "java" 所有的具体值,我们还可以添加属性 g, 即 /\b java \b/gi .
以下是正则表达式的属性:
字符含义
_________________________________________
i 执⾏⼤⼩写不敏感的匹配
g 执⾏⼀个全局的匹配,简⽽⾔之,就是到所有的匹配,⽽不是在到第⼀个之后就停⽌了
_________________________________________
除属性 g 和 i 之外,正则表达式就没有其它像属性⼀样的特性了.如果将构造函数 RegExp 的静态属性 multiline 设置为 true ,那么模式匹配将以多⾏的模式进⾏.在这种模式下,锚字符 ^ 和 $ 匹配的不只是检索字符串的开头和结尾,还匹配检索字符串内部的⼀⾏的开头和结尾.例如:模式 /Java$/ 匹配的是 "Java",但是并不匹配"Java\nis fun" .如果我们设置了 multiline 属性,那么后者也将被匹配:
RegExp.multiline = true;
正则表达式(regular expression)对象包含⼀个正则表达式模式(pattern)。它具有⽤正则表达式模式去匹配或代替⼀个串(string)中特定字符(或字符集合)的属性(properties)和⽅法(methods)。要为⼀个单独的正则表达式添加属性,可以使⽤正则表达式构造函数(constructor function),⽆论何时被调⽤的预设置的正则表达式拥有静态的属性(the predefined RegExp object has static properties that are set whenever any regular expression is used, 我不知道我翻得对不对,将原⽂列出,请⾃⾏翻译)。
创建:
⼀个⽂本格式或正则表达式构造函数
⽂本格式: /pattern/flags
正则表达式构造函数: new RegExp("pattern"[,"flags"]);
参数说明:
pattern -- ⼀个正则表达式⽂本
flags -- 如果存在,将是以下值:
g: 全局匹配
i: 忽略⼤⼩写
gi: 以上组合
[注意] ⽂本格式的参数不⽤引号,⽽在⽤构造函数时的参数需要引号。如:/ab+c/i new RegExp("ab+c","i")是实现⼀样的功能。在构造函数中,⼀些特殊字符需要进⾏转意(在特殊字符前加"\")。如:re = new RegExp("\\w+")
正则表达式中的特殊字符
字符含意
\做为转意,即通常在"\"后⾯的字符不按原来意义解释,如/b/匹配字符"b",当b前⾯加了反斜杆后/\b/,转意为匹配⼀个单词的边界。
-或-
对正则表达式功能字符的还原,如"*"匹配它前⾯元字符0次或多次,/a*/将匹配a,aa,aaa,加了"\"后,/a\*/将只匹配"a*"。
^匹配⼀个输⼊或⼀⾏的开头,/^a/匹配"an A",⽽不匹配"An a" $匹配⼀个输⼊或⼀⾏的结尾,/a$/匹配"An a",⽽不匹配"an A"
*匹配前⾯元字符0次或多次,/ba*/将匹配b,ba,baa,baaa
+匹配前⾯元字符1次或多次,/ba*/将匹配ba,baa,baaa
匹配前⾯元字符0次或1次,/ba*/将匹配b,ba
(x)匹配x保存x在名为$1...$9的变量中
x|y匹配x或y
{n}精确匹配n次
{n,}匹配n次以上
{n,m}匹配n-m次
[xyz]字符集(character set),匹配这个集合中的任⼀⼀个字符(或元字符) [^xyz]不匹配这个集合中的任何⼀个字符
[\b]匹配⼀个退格符
\b匹配⼀个单词的边界
\B匹配⼀个单词的⾮边界
\cX这⼉,X是⼀个控制符,/\cM/匹配Ctrl-M
\d匹配⼀个字数字符,/\d/ = /[0-9]/
\D匹配⼀个⾮字数字符,/\D/ = /[^0-9]/
\n匹配⼀个换⾏符
\r匹配⼀个回车符
\s匹配⼀个空⽩字符,包括\n,\r,\f,\t,\v等
\S匹配⼀个⾮空⽩字符,等于/[^\n\f\r\t\v]/
\t匹配⼀个制表符
\v匹配⼀个重直制表符
\w匹配⼀个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[\w]匹配"$5.98"中的5,等于[a-zA-Z0-9]
\W匹配⼀个不可以组成单词的字符,如[\W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]。
说了这么多了,我们来看⼀些正则表达式的实际应⽤的例⼦:
E-mail地址验证:
function test_email(strEmail) {
var myReg = /^[_a-z0-9]+@([_a-z0-9]+\.)+[a-z0-9]{2,3}$/;
st(strEmail)) return true;
return false;
}
HTML代码的屏蔽
function mask_HTMLCode(strInput) {
var myReg = /<(\w+)>/;
place(myReg, "<$1>");
}
正则表达式对象的属性及⽅法
预定义的正则表达式拥有有以下静态属性:input, multiline, lastMatch, lastParen, leftContext, rightContext和$1到$9。其中input和multiline可以预设置。其他属性的值在执⾏过exec或test⽅法后被根据不同条件赋以不同的值。许多属性同时拥有长和短(perl风格)的两个名字,并且,这两个名字指向同⼀
个值。(JavaScript模拟perl的正则表达式)
正则表达式对象的属性
属性含义
$1...$9如果它(们)存在,是匹配到的⼦串
$_参见input
$*参见multiline
$&参见lastMatch
js在字符串中添加字符$+参见lastParen
$`参见leftContext
$’ 参见rightContext
constructor 创建⼀个对象的⼀个特殊的函数原型
global 是否在整个串中匹配(bool型)
ignoreCase 匹配时是否忽略⼤⼩写(bool型)
input 被匹配的串
lastIndex 最后⼀次匹配的索引
lastParen 最后⼀个括号括起来的⼦串
leftContext 最近⼀次匹配以左的⼦串
multiline 是否进⾏多⾏匹配(bool型)
prototype 允许附加属性给对象
rightContext 最近⼀次匹配以右的⼦串
source 正则表达式模式
lastIndex 最后⼀次匹配的索引
正则表达式对象的⽅法
⽅法含义
compile
正则表达式⽐较
exec
执⾏查
test
进⾏匹配
toSource 返回特定对象的定义(literal representing),其值可⽤来创建⼀个新的对象。重载Source⽅法得到的。
toString
返回特定对象的串。重载String⽅法得到的。
valueOf
返回特定对象的原始值。重载Object.valueOf⽅法得到例⼦
<script language = "JavaScript">
var myReg = /(\w+)\s(\w+)/;
var str = "John Smith";
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论