JavaScript正则表达式

正则表达式是一个描述字符模式的对象。
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" 的字符串

 

1.直接量字符

 

默认的:在正则表达式中所有的字母字符和数字都是按照字面意思与自身相匹配的

javascript的正则表达式还通过以反斜杠(\)开头的转义序列支持某些非打印字符 匹配


非打印字符
________________________________

\ f 换页符
\ n 换行符
\ r 回车
\ t 制表符
\ v 垂直制表符
\ / 一个 / 直接量
\ \ 一个 \ 直接量
\ . 一个 . 直接量
\ * 一个 * 直接量
\ + 一个 + 直接量
\ ? 一个 ? 直接量
\ | 一个 | 直接量
\ ( 一个 ( 直接量
\ ) 一个 ) 直接量
\ [ 一个 [ 直接量
\ ] 一个 ] 直接量
\ { 一个 { 直接量
\ } 一个 } 直接量
\ xxx 由十进制数 xxx 指 定的ascii码字符
\ xnn 由十六进制数 nn 指定的ascii码字符
\ cM 控制字符^M. 匹配一个 Control-M 或回车符。

x 的值必须为 A-Z 或 a-z 之一

____________________________________

 

特殊字符共有13个:$, *, +, ?, ^, [], (), {}, |, \, /


作为程序员,单引号和双引号不是特殊字符会也许让我们感到很惊讶。但这是正确的。

因为我们在编程的时候,编程语言会知道引号之间的哪些字符表示特殊意义,

编译器在把字符串x传递给regex解释引擎之前,会把它们处理成regex。

比如,在C#中,如果我们要匹配 1\+1=2 ,在程序中我们要这样写: “1\\+1=2” ,

C#编译器会把 “\\” ,处理为一个“\” 。

同样,如果要匹配 C:\Temp 首先,在javascript的正则表达式要这样写 C:\\Temp

,然后,在程序中我们应该这样写:“ C:\\\\temp”。

 

2.字符类

 

将单独的直接符放进中括号内就可以组合成字符类.

一个字符类和它所包含的任何一个字符都匹配

所以正则表达式 / [abc] / 和字母 "a" , "b" , "c" 中的任何一个都匹配.

另外还可以定义否定字符类,这些类匹配的是除那些包含在中括号之内的字符外的所有字符.

定义否定字符类时,要将一个 "^" 符号作为作为从左中括号算起的第一个字符

 

可以在字符集中用连字符“-”来表示一个范围:

比如:[0-9]的结果和[0123456789]的匹配结果都是相同的。

字符集中的范围可以有多种。比如[0-9a-fA-F]表示匹配所有的16进制,包括大小写;

也可以把范围和单个字符组合在一起用,[0-9a-fxA-FX]表示匹配所有的16进制或者一个字符X。

字符集的顺序不会影响结果。

 

特殊字符和转义序列的字符类

_________________________________________
[...] 位于括号之内的任意字符
[^...] 不在括号之中的任意字符
. 除了换行符之外的任意字符,等价于[^\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.复制

 

A>复制前一模式若干次 的模式

B>复制前一模式指定次 的模式

C>复制前一模式次数在一定范围内 的模式

 

正则表达式的复制字符含义:

____________________________________________________
{n, m} 匹配前一项至少n次,但是不能超过m次
{n, }   匹配前一项>=n次
{n}     匹配前一项恰好n次
?         匹配前一项0次或1次,也就是说前一项是可选的. 等价于 {0, 1}
+        匹配前一项1次或多次,等价于{1,}
*        匹配前一项0次或多次.等价于{0,}
____________________________________________________

 

例子:
/\d{2, 4}/            //匹配数字2到4个范围内.

/\w{3} \d?/         //匹配三个单字字符和一个任意的数字.

/\s+java\s+/       //匹配字符串"java" ,并且该串前后可以有一个或多个空格.

/[^"] * /             //匹配零个或多个非引号字符.

 

4.选择,分组和引用


正则表达式的语法 包括:

指定选择项, 对子表达式分组 和引用前一子表达式的特殊字符

 

(或)分组用字符(|)分隔供选择的字符.

例如: /ab|cd|ef/ 匹配的是 "ab",或者 "cd",又或者 "ef".

 /\d{3} | [a-z]{4}/ 匹配的是要么是一个三位数,要么是四个小写字母.

 

正则表达式中括号具有几种作用:

A> 把单独的项目分组成子表达式, 以便可以像处理一个独立的单元那种用 *、+或? 来处理那些项目

例如: /java(script) ?/ 匹配的是字符串 "java",其后既可以有 "script",也可以没有.

 / (ab|cd) + |ef) / 匹配的既可以是字符串 "ef",也可以是字符串"ab" 或者 "cd" 的一次或多次重复

 

B> 在完整的模式中定义子模式。当一个正则表达式成功地和目标字符串相匹配时,可以从目标串中

抽出和括号中的子模式相匹配的部分.

例如, 假定我们正在检索的模式是一个或多个字母后面跟随一位或多位数字,

那么我们可以使用模式 / [a-z] + \ d+/.但是由于假定我们真正关心的是每个匹配尾部的数字,

那么如果我们将模式的数字部分放在括号中 / [a-z] + (\d+)/ ,

我们就可以从所检索到的任何匹配中抽取数字部分了,之后我们会对此进行解析的.

 

C> 允许我们在同一正则表达式的后面引用前面的子表达式.

这是通过在字符串 \ 后加一位或多位数字来实现的.

数字指的是代括号的子表达式在正则表达式中的位置.

例如: \1 引用的是第一个代括号的子表达式. \3 引用的是第三个代括号的子表达式.

注意,由于子表达式可以嵌套在其它子表达式中, 所以它的位置是被计数的左括号的位置.

 

待续......

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值