1. 程式人生 > >js正則學習

js正則學習

color test hash inpu pear 小括號 cde ast 個數

一直對正則很糾結也很畏懼,以前感覺花時間理解一個個奇奇怪怪的符號,還不如直接百度谷歌之。

但知其然不知其所以然也是種痛苦,所以花了兩天稍微學了一下,雖然沒學很深入徹底,但也比之前進步不少,特此筆記。

js正則

g:表示全局,匹配全部
i:表示不區分大小寫
m:表示匹配多行(匹配換行兩端的潛在匹配)

RegExp實例屬性:
  global:是否設置了g
  ignoreCase:是否設置了i
  lastIndex:表示下一次exec開始搜索下個匹配項的字符位置
  multiline:表示是否設置了m
  source:正則表達式的字符串表示

RegExp實例方法:
  exec(str);用於捕獲組(用小括號指定一個子表達式),返回包含第一個匹配項信息的數組。
  test(str);用於驗證是否匹配,返回true或false。

RegExp構造函數屬性:
  input[$_]:最近一次要匹配的字符串,opera未實現
  lastMatch[$&]:最近一次匹配項,opear未實現
  lastParen[$+]:最近一次匹配的捕獲組,opera未實現
  leftContext[$’]:input字符串中lastMatch之前的文本
  multiline[$*]:表示是否所有表達式都是用多行模式,ie和Opera不支持
  rightContext[$‘]:input字符串中lastMatch之後的文本

\ :轉義字符
^ : 匹配字符串開頭,如/^a/ 匹配 an A 而不匹配 An a
$ : 匹配字符串結尾,如/a$/ 匹配 An a 而不匹配 an A
* : 匹配匹配前面元字符0或多次 /ba*/將匹配b,ba,baa,baaa * = {0,}
+ : 匹配前面元字符1次或多次 /ba+/ 匹配ba + = {1,}
? : 匹配前面元字符0次或1次,/ba?/將匹配b,ba ? = {0,1}
(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 匹配一個制表符,tab建
\v 匹配一個重直制表符
\w 匹配一個可以組成單詞的字符(alphanumeric,這是我的意譯,含數字),包括下劃線,如[\w]匹配"$5.98"中的5,等於[a-zA-Z0-9]
\W 匹配一個不可以組成單詞的字符,如[\W]匹配"$5.98"中的$,等於[^a-zA-Z0-9]。
\1 對第一個捕獲組的文本進行引用,用於再次匹配 如:(...)...\1
(?=) 向前正匹配 (?!)向前負匹配

以上就是大部分常用的令人生畏的正則語法,用了之後其實常用的也是有規律可尋,難以概況但熟能生巧。

下面就是從書中摘取的實例:

//正則表達式:
function testUrl(){
    var pt = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
    
    //pt解析:
//    ^ 匹配字符串開頭
//    (?:(A-Za-z+):)?        ?:表示非捕獲組    (A-Za-z+):表示匹配字母後加:,且是第一個捕獲組    ?表示分組可選
// (\/{0,3}) ()表示第二個捕獲組 \/轉義,匹配/ {0,3}匹配前面字符0-3次 // ([0-9.\-A-Za-z]+) ()第三個捕獲組 []匹配方括號內的字符 0-9 . - A-Za-z 匹配這四種字符 +多個 // (?::(\d+))? ?:非捕獲組 :匹配冒號開始 (\d+)第四個捕獲組,匹配多個數字 ?可選 // (?:\/([^?#]*))? \/匹配/ ([^?#]*)第五個捕獲組,匹配除?#外的字符 *該字符類將匹配n次 // (?:\?([^#]*))? \?匹配? ([^#]*)第六個捕獲組,匹配除#外的字符 *匹配多次 // (?:#(.*))? #匹配# (.*)第七個捕獲組 .匹配除結束符外的所有字符 *匹配多次 // $ 字符串結束 var url = ‘http://www.ora.com:80/goodparts/abcde?q#fragment‘; var res = pt.exec(url); var names = [‘url‘,‘scheme‘,‘slash‘,‘host‘,‘port‘,‘path‘,‘query‘,‘hash‘]; var blanks = ‘ ‘; for(var i=0;i<names.length;i++){ console.log(names[i]+‘:‘+blanks.substring(names[i].length),res[i]); } }

 

function testNumber(){
    var pt = /^-?\d+(?:.\d*)?(?:e[+\-]?\d+)?$/i;
//pt解析
//    ^  $ 分別匹配開頭和結尾
//    -?    -匹配0次或一次,也就是可選
//    \d+  匹配至少一個數字
// (?:.\d*)?   ?:非捕獲組   .匹配小數點  \d* 小數點後匹配任意個數字  ?可選
//    (?:e[+\-]?\d+)?   ?:非捕獲組  e匹配e和E  [+\-] 匹配加號或者減號  ?可選  \d+匹配一個以上數字   ?可選

    console.log(pt.test(-1));
    console.log(pt.test(100.1993));
    console.log(pt.test("sss"));
    console.log(pt.test(123.45E-67));
}

正則中用法比較重要的個人感覺就是捕獲組,和非捕獲組,捕獲組在replace方法中也會很有用,比如創建模板模式,通過一些匹配替換內容。

js正則學習