ホームページ > 記事 > ウェブフロントエンド > JavaScript 上級プログラミング(第 3 版)学習ノート 12 js 正規表現_基礎知識
需要指出的是,这里只是总结了正则表达式的常用的且比较简单的语法,而不是全部语法,在我看来,掌握了这些常用语法,已经足够应对日常应用了。正则表达式不只是应用在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)也可以自定义组名,语法是(?
(5)也可以不保存匹配内容,也不分配组号,语法是(?:exp)。
(6)小括号有一些其他特殊语法,这里列举几种,不再深入讨论:
分类 | 代码/语法 | 说明 |
---|---|---|
捕获 | (exp) | 匹配exp,并捕获文本到自动命名的组里 |
(? |
匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) | |
(?:exp) | 匹配exp,不捕获匹配的文本,也不给此分组分配组号 | |
零宽断言 | (?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置 | |
(?!exp) | 匹配后面跟的不是exp的位置 | |
(? | 匹配前面不是exp的位置 | |
注释 | (?#comment) | 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读 |
この時点では、一般的に使用される正規表現を理解するだけで十分です。正規表現をさらに学習したい場合は、正規表現に関する 30 分間の入門チュートリアルを参照してください。 JavaScript での正規表現の実装について学びましょう。
2. Javascript の正規表現オブジェクト RegExp
1. 正規表現を作成します
(1) リテラルを使用します: 構文 var exp = /pattern/flags;
A. パターンは任意の正規表現です
B. フラグには 3 種類あります: g はグローバル モード、i は大文字と小文字を無視する、m は複数行モードを意味します
(2) RegExp 組み込みコンストラクターを使用します: 構文 var exp = new RegExp(pattern, flags);
A. コンストラクターを使用する場合、パターンとフラグは両方とも文字列形式であるため、エスケープ文字には二重エスケープが必要です。次に例を示します。
字面量 | 构造函数 |
/[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: string。リテラル形式で作成された文字列パターンを表します。コンストラクターを使用してインスタンスが作成された場合でも、文字列パターンはリテラル形式で保存されます。
3. インスタンスメソッド
(1)exec()メソッド
A. 1 つのパラメータ。パターンが適用される文字列であり、最初に一致した項目情報の配列を返します。一致しない場合は、null が返されます。
B. 返される配列は Array インスタンスですが、正規表現が適用される文字列と文字列内の一致する項目の位置をそれぞれ表す入力属性とインデックス属性も持ちます。
C. 一致する場合、返される配列の最初の項目はパターン全体に一致する文字列であり、他の項目はパターン内のグループに一致する文字列です (グループ化がない場合、返される配列には、 1項目)。
D. exec() では、g を設定しても毎回一致が返されますが、g が設定されていない場合は exec を複数回呼び出したときの検索開始位置が異なります。 「検索の開始」から戻るたびに。
(2) test()メソッド
文字列パラメータを受け入れ、一致する場合は true、一致しない場合は false を返します。
3. 分析例
PhoneGap のソース コードから書式設定に使用される正規表現を見てみましょう