JS中正則表達式

正則表達式的定義

js中的正則表達式使用RegExp對象表示,兩種建立正則表達式對象的方法javascript

直接量定義

將表達式包含在斜槓之間java

var pattern = /js/;

構造函數定義:

使用RegExp()構造函數定義正則表達式

var pattern = new RegExp('js');

正則表達式中的字符

特殊字符須要轉譯:使用反斜槓\進行轉移函數

字符類

下爲幾種常見的字符類code

  • [...]在方括號的任意字符
  • [^...]不在方括號內的任意字符
  • . 換行符及其餘行終止符以外的任意字符

重複

  • {n,m} 匹配前一項至少n次,最多m次
  • {n,} 匹配前一項n次或者屢次
  • {n} 匹配前一項n次
  • ? 匹配前一項0或1次,既前一項可選,既{0,1}
  • + 匹配前一次一次或屢次
  • * 匹配前一次0或屢次 eg:/[^(]*/匹配非左括號0或多個

非貪婪匹配

儘量少的匹配,在待匹配的字符後面加?對象

var p1 = /[a]+/;
var p2 = /[a]+?/;
var str = 'aaaaaaasss';
str.match(p1);  /*["aaaaaaa", index: 0, input: "aaaaaaasss"]*/
str.match(p2); /*["a", index: 0, input: "aaaaaaasss"] 儘量少的匹配*/

分組和引用

圓括號的做用ip

  • 把單獨的組合合成子表達式
var p = /java(script)?/ 
//表示能夠有script也能夠沒有,script爲一個子表達式
  • 在完整的模式中定義子模式
var p1 = /[a-z]+\d+/;
var p2 = /[a-z]+(\d+)/;
var str = 'abc123456aaa';
str.match(p1); 
//["abc123456", index: 0, input: "abc123456aaa"] 能夠匹配出字符串abc123456
str.match(p2);
/* ["abc123456", "123456", index: 0, input: "abc123456aaa"] 能夠把子模式(\d+)單獨匹配出來*/
  • 容許在同一正則表達式後面引用前面的子表達式
var p1 = /['"][^'"]*['"]/; //匹配引號之中的文本,不能保證左右匹配
var p2 = /(['"])[^'"]*\1/; //用\n表示第n個圓括號中的子表達式,計數以右邊括號的位置爲準,\1表示模式匹配的文本的引用,而不是對子表達式的引用,能夠保證引號匹配。
var a = '\'aaaa\'123';
var b = '\'aaaa\"123';
a.match(p1); ["'aaaa'", index: 0, input: "'aaaa'123"]//正常匹配
a.match(p2); ["'aaaa'", "\'", index: 0, input: "'aaaa'123"] //能夠匹配出子表達式['"]中對應的字符 '  (\爲本身加的轉譯符)
b.match(p1); ["'aaaa"", index: 0, input: "'aaaa"123"]//["'aaaa"", index: 0, input: "'aaaa"123"] 正常匹配
b.match(p2);//null ,由於\1表示第一個組匹配到的文本的引用,既 ' 而不是 "

***不能在字符類中使用這種引用,例如字符串

/['"][^\1]*\1/

這種寫法是非法的 ***若是隻想分組,但不想分組被編號,能夠使用(?: )來進行分組,例如:input

var p = /([Jj]ava(?:script)?)\sis\s(fun\w*)/ 
//(?: )中的字符能夠被做爲分組匹配,但不會進行編號,則\2表示與(fun\w*)匹配的文本

指定位置匹配

  • \b表示單詞的邊界;\B表示非單詞的邊界
  • ^表示字符串的開始;$表示字符串的結尾
  • 先行斷言,定義在(?= )之間
var p = /[Jj]ava(script)?(?=\:)/;
var str1 = 'Javascript:aaa';
var str2 = 'Javascript aaa';
str1.match(p); //["Javascript", "script", index: 0, input: "Javascript:aaa"],匹配成功,可是匹配結果中不包含:
str2.match(p); //null,不能匹配,由於先行斷言不知足
  • 負向先行斷言,定義在(?! )之間,表示字符不匹配XXX
var p = /[Jj]ava(?!script)[A-Z]\w*/; 
//表示java後面能夠跟大寫字母和任意多的ASCII單詞,可是不能包含script
var str1 = 'javaBean';
var str2 = 'javascript';
var str3 = 'javascripter';
str1.match(p);/*["javaBean", index: 0, input: "javaBean"] 匹配成功*/
str2.match(p); //null
str3.match(p); //null

修飾符

  • i 不區分大小寫
  • g 全局匹配
  • m 多行數據中執行匹配

字符串中的正則方法

  • search() 返回第一個與之匹配的字串的位置,若是找不到匹配的字串則返回-1,不支持全局檢索,會忽略修飾符g
  • replace() 用於檢索與替換,第一個參數爲正則表達式,第二個參數爲要替換的字符串。 replace() 可用$n表示第n個子表達式,進行匹配替換。
var p = /"([^"]*)"/g;
text = '1,"2,3","5",4';
text.replace(p, 'A$1A');//1,A2,3A,A5A,4,匹配出全部p相匹配的部分,$1表明([^"]*)中匹配的結果,並將全部"替換爲A
相關文章
相關標籤/搜索