首頁 >web前端 >js教程 >JavaScript高階程式設計(第3版)學習筆記12 js正規表示式_基礎知識

JavaScript高階程式設計(第3版)學習筆記12 js正規表示式_基礎知識

WBOY
WBOY原創
2016-05-16 17:49:181044瀏覽

需要指出的是,这里只是总结了正则表达式的常用的且比较简单的语法,而不是全部语法,在我看来,掌握了这些常用语法,已经足够应对日常应用了。正则表达式不只是应用在ECMAScript中,在JAVA、.Net、Unix等也有相应应用,这篇文章则是以ECMAScript中的正则表达式为基础总结的。

一、正则表达式基础

1、普通字符:字母、数字、下划线、汉字以及所有没有特殊意义的字符,如ABC123。在匹配时,匹配与之相同的字符。

2、特殊字符:(需要时,使用反斜杠“”进行转义)

字符 含义 字符 含义 字符 含义 字符 含义
\a 响铃符 = \x07 ^ 匹配字符串的开始位置 \b 匹配单词的开始或结束 {n} 匹配n次
\f 换页符 = \x0C $ 匹配字符串的结束位置 \B 匹配不是单词开始和结束的位置 {n,} 匹配至少n次
\n 换行符 = \x0A () 标记一个子表达式的开始和结束 \d 匹配数字 {n,m} 匹配n到m次
\r 回车符 = \x0D [] 自定义字符组合匹配 \D 匹配任意不是数字的字符 [0-9] 匹配0到9中任意一个数字
\t 制表符 = \x09 {} 修饰匹配次数的符号 \s 匹配任意空白字符 [f-m] 匹配f到m中任意一个字母
\v 垂直制表符 = \x0B . 匹配除换行符外的字符 \S 匹配任意非空白字符    
\e ESC符 = \x1B ? 匹配0或1次 \w 匹配字母或数字或下划线或汉字    
\xXX 使用两位十六进制表示形式,可与该编号的字符匹配 + 匹配1或多次 \W 匹配任意不是字母、数字、下划线和汉字的字符    
\uXXXX 用四位十六进制表示形式,可与该编号的字符匹配 * 匹配0或多次 [^x] 匹配除x外的所有字符    
\x{XXXXXX} 使用任意位十六进制表示形式,可与该编号的字符匹配 | 左右两边表达式之间“或”关系 [^aeiou] 匹配除aeiou外的所有字符    

上面列举的这些特殊字符,可以大致的分为: 

(1)不便书写字符:如响铃符(a)、换页符(f)、换行符( )、回车符( )、制表符( )、ESC符(\e)

(2)十六进制字符:如两位(\x02)、四位(\x012B)、任意位(x{A34D1})

(3)表示位置字符:如字符串开始(^)、字符串结束($)、单词开始和结束()、单词中间(\B)

(4)表示次数字符:如0或1次(?)、1或多次(+)、0或多次(*)、n次({n})、至少n次({n,})、n到m次({n,m})

(5)修饰字符:如修饰次数({})、自定义组合匹配([])、子表达式(())

(6)反义字符:

  (A)通过大小写反义:如和B、d和D、s和S、w和W

  (B)通过[^]反义:如[^x]、[^aeiou]

  (C)其它特例:如 和.也构成反义

(7)范围字符:如数字范围([0-9])、字母范围([f-m])

(8)逻辑字符:如表示或(|)

3、转义

(1)使用反斜杠“”转义单个字符

(2)使用“Q...\E”转义,将表达式中间出现的字符全部作为普通字符

(3)使用“U...\E”转义,将表达式中间出现的字符全部作为普通字符,并且将小写字母转换成大写匹配

(4)使用“L...\E”转义,将表达式中间出现的字符全部作为普通字符,并且将大写字母转换为小写匹配

4、贪婪模式与懒惰模式

   如果正则表达式中含有次数字符时,一般情况下,会尽可能匹配更多的字符,比如用l*n来匹配linjisong的话,会匹配linjison,而不是 lin,这种模式也就是正则表达式的贪婪模式;相对应的,可以通过添加字符“?”来设置为懒惰模式,也即尽可能匹配更少字符。如*?表示重复0次或多次, 但尽可能少重复。

5、分组和反向引用

(1)用小括号(())将表达式包含,可以使得表达式作为一个整体来处理,从而达到分组的目的。

(2)默认情况下,每个分组会自动获取一个组号,按照左括号的顺序,从1向后编号。

(3)引擎在处理时,会将小括号内部表达式匹配的内容保存下来,以方便在匹配过程中或匹配结束后进一步处理,可以使用反斜杠和组号来引用这个内容,如1表示第一个分组匹配的文本。

(4)也可以自定义组名,语法是(?exp),这个时候反向引用时,还可以使用\k

(5)也可以不保存匹配内容,也不分配组号,语法是(?:exp)。

(6)小括号有一些其他特殊语法,这里列举几种,不再深入讨论:

分类 代码/语法 说明
捕获 (exp) 匹配exp,并捕获文本到自动命名的组里
(?exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言 (?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(? 匹配前面不是exp的位置
注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

到此,對於理解常用的正規表示式已經足夠了,若想繼續學習正規表示式的,可以參考正規表示式30分鐘入門教學。下面再熟悉一下Javascript中的正規表示式實作。

二、Javascript中的正規表示式物件RegExp

1、建立正規表示式

(1)使用字面量:語法 var exp = /pattern/flags;

  A、pattern是任何正規表示式

  B、flags有三種:g表示全域模式、i表示忽略大小寫、m表示多行模式

(2)使用RegExp內建建構子:語法 var exp = new RegExp(pattern, flags);

  A、使用建構子時,pattern和flags都是字串形式,所以對於轉義字元需要雙重轉義,例如:

字面量 构造函数
/[bc]at/ "\[bc\]at"
/.at/ "\.at"
/name/age/ "name\/age"
/d.d{1,2}/ "\d.\d{1,2}"
/w\helllo3/ "\w\hello\123"

說明:ECMAScript 3使用字面量時會共用一個RegExp實例,使用new RegExp(pattern,flags)會為每個正規表示式建立一個實例;ECMAScript 5規定每次都建立新實例。

2、實例屬性

(1)global:布林值,表示是否設定了g標誌。

(2)ignoreCase:布林值,表示是否設定了i標誌。

(3)multiline:布林值,表示是否設定了m標誌。

(4)lastIndex:整數,表示開始搜尋下一次符合項的字元位置,從0算起。

(5)source:字串,表示按照字面量形式創建的字串模式,即便實例使用建構函式創建,儲存的也是字面量形式的字串模式。

3、實例方法

(1)exec()方法

  A、一個參數,即要套用模式的字串,傳回第一個符合項目資訊的數組,沒有符合時傳回null。

  B、傳回的陣列是Array實例,但還額外有input和index屬性,分別表示套用正規表示式的字串和符合項目在字串中的位置。

  C、匹配時,在傳回的陣列中,第1項是與整個模式相符的字串,其他項目是與模式中的分組相符的字串(如果沒有分組,則傳回陣列只有1項) 。

  D、對於exec(),即使設定了g,每次返回的也是一個匹配項,不同的是,設定了g,多次調用exec的開始搜尋位置不同,沒有設定g,每次都從開始搜尋。

(2)test()方法

  接受一個字串參數,匹配回傳true,不符回傳false。

三、實例分析

下面看一個出自PhoneGap原始碼中用來格式化的正規表示式

複製程式碼 程式碼如下:

var pattern = /(.*?)%(.)(.*)/;
var str = 'lin%%jisong';
var match = pattern.exec (str);
console.info(match.join(','));//lin%%jisong,lin,%,jisong

var pattern2 = /(.*)%(. )(.*)/;
var match2 = pattern2.exec(str);
console.info(match2.join(','));//lin%%jisong,lin%,j,isong


分析:這裡pattern和pattern2都包含三個分組,第2、3個分組相同,第2個分組(.)匹配任一個非換行字符,第3個分組(.*)盡可能多(貪婪模式)的匹配任意非換行字符,pattern中的第1個分組(.*?)盡可能少(懶惰模式)的匹配任意非換行字符,而pattern2中的第1個分組(.*)則是盡可能多(貪婪模式)的匹配任意非換行字元了。因此在保證整個模式匹配成功(從而需要保留一個%字元用於匹配正則表達式中的%)的前提下,pattern中第1個分組匹配成了lin,而pattern2中第1個分組匹配成了lin %,分析到這裡上例的輸出也就不難理解了。
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn