//1.0 字符類
[...]
方括號內的任意字符
[^...]
再也不方括號裏面的任意字符
.
除換行符和其餘Unicode行終止符以外的任意字符
\w
任何ASCII字符組成的單詞,等價於[a-zA-Z0-9_]
\W
任何不適ASCII碼字符組成的單詞,等價於[^a-zA-Z0-9_]
\s
任何Unicode空白符
\S
任何非Unicode空白符
\d
任何ASCII數字,等價於[0-9]
\D
任何非Unicode數字,等價於[^0-9]
[\b]
退格直接量(特例)
方括號裏面也能夠有特殊的轉義字符,例如[/\d\s/]匹配任意空白符或者數字
//1.1 重複
{n,m}
匹配前一項至少n次,但不能超過m次
{n,}
匹配前一項至少n次或者更屢次
{n}
匹配前一項至少n次
?
匹配0次或者1次,等價於{0,1}
+
匹配1次或者屢次,等價於{1,}
*
匹配0次或者屢次,等價於{0,}
//some examples:
/\d{2,5}/ //匹配2~5個數字
/\w{3}\d*/ //匹配單個單詞和0個或多個數字
/\s+java\s+/ //匹配先後有一個或多個空格的java
//1.2 選擇、分組和引用
字符"|"用於分隔供選擇的字符,/android|iphone|ipod/能夠匹配android,也能夠匹配iphone或者ipod,匹配次序是從左至右的,
當左邊的匹配後就會忽略右邊的,因此說/a|abc/匹配"abc"時只能匹配a
正則表達式中,圓括號(())的做用有多種:
a:把單獨的項組合成子表達式,例如:
/java(script)?/既能夠匹配"java"也能夠匹配"javascript"
/(aa|bb)+cc/能夠匹配一個或多個"aa"或者"bb"與"cc"組成的字符串
b:在完整的模式中定義子模式
假定咱們正在檢索的模式是一個或多個小寫字母后面跟了一個或多個數字,咱們的正則能夠這樣寫:/[a-z]+\d+/。
可是若是咱們真正關心的是每一個匹配尾部的數字,則能夠將模式的數字部分放在"()"中,如:/[a-z]+(\d+)/
c:容許在同一正則表達式中引用前面的子表達式
經過在字符「\」後面家覺得或多爲數字來實現。這個數字指定了子表達式在正則表達式中的位置,他的位置是參與計數
的左括號的位置,例如,下面的正則表達式中,嵌套的子表達式([Ss]cript?)能夠用\2來代替:
/([Jj]ava([Ss]cript)?)\sis\s(fun\w*)/
對正則表達式前一個子表達式的引用,並非指對子表達式模式的引用,而是與那個模式匹配的文本的引用。例如,下面
的正則用於匹配單引號或雙引號以內的0個或多個字符,但它並不要求左右測的引號匹配:
/['"][^'"]*['"]/
若是要匹配左側和右側的引號匹配,則能夠這樣:
/(['"])[^'"]*\1/
若是不想建立分組的數字編碼引用,則可使用(?:)來分組:
/([Jj]ava(?:[Ss]cript)?)\sis\s(fun\w*)/
這裏"\2"引用了與(fun\w*)匹配的文本。
//1.3 制定位置匹配
邊界:若是咱們想匹配"javascript"這個單詞,能夠這樣寫/^javascript$/,可是咱們想匹配一個字符串中的"javascript"這個單詞的時候,就要用到
\b,它能夠匹配一個單詞的邊界,即位於\w(ASCII單詞)和\W(非ASCII單詞)之間的邊界:
/\bjavascript\b/ 能夠匹配"i love javascript,and you ?",而不會匹配"i lovejavascript..."
斷言:
零寬正想斷言:
若是在符號"(?="和")"之間加入一個表達式,那麼它就是一個斷言,用來講明括號內的表達式必須正確的匹配。例如:
能夠用/[Jj]ava([Ss]cript)?(?=\:)/來匹配"javascript: the definitive guide"中的javascript,而不能匹配"java in a nutshell"中的java。
零寬負向斷言:
(?!p)表示將不匹配p,例如:
/Java(?!Script)([A-Z]\w*)/ 能夠匹配Java,但不能匹配JavaScript
//1.4 修飾符
i:執行不區分大小寫的匹配
g:執行一個全局的匹配,即找到全部的匹配爲止,而不是找到第一個就中止
m:多行匹配模式,^匹配一行的開頭和字符串的開頭,$匹配一行的結尾和字符串的結尾 :/java$/im 將匹配"Java"和"java\nis fun"
//1.5 String方法
search(): "javascript".search(/script/i);
//4;
serach方法不支持全局檢索
replace(): "java: hi,javascript".replace(/java/gi,"ruby");
//ruby: hi,rubyscirpt
正則中使用圓括號括起來的表達式是有從左到右的索引的,並且正則會記憶與每一個子表達式匹配的文本。若是在替換的字符串中出現了$加數字,那麼replace方法會用與指定的子表達式匹配的文原本替換這兩個內容:
好比,能夠用它將字符串總的英文引號替換爲中文半角引號:
"hello,\"javascript\"...".replace(/"([^"]*)"/g,'「$1」');
//hello,「javascript」...
match(): 此方法返回的是由匹配結果組成的數組:
"1 plus 2 equals 3".match(/\d/g);
//["1","2","3"]
"1 plus 2 equals 3".match(/\d/);
//["1"]
若是match方法沒有進行全局檢索,match返回的數組的第一個元素是匹配的字符串,剩餘的元素則是子表達式匹配的結果,這個功能頗有用,例如,
採用下面的代碼來解析URL:
var url = /(\w+):\/\/([\w.]+)\/(\S*)/;
var text = "my oschina blog: http://my.oschina.net/johny/blog";
var result = text.match(url);
result.forEach(function(str) {
console.log(str);
});
/*
http://my.oschina.net/johny/blog
http
my.oschina.net
johny/blog
*/
split(): "1,2,3,4".split(","); //["1","2","3"]