閱讀74 返回首頁    go 阿裏雲 go 技術社區[雲棲]


js正則表達式

RegExp 是正則表達式的縮寫;當您檢索某個文本時,可以使用一種模式來描述要檢索的內容;正則表達式就是這種模式。簡單的模式可以是一個單獨的字符,更複雜的模式包括了更多的字符,並可用於解析、格式檢查、替換等等;您可以規定字符串中的檢索位置,以及要檢索的字符類型,等等。

正則表達式有哪些用處

1.正則表達式可以測試字符串的某個模式;例如:可以對一個輸入字符串進行測試,看在該字符串是否存在一個電話號碼模式或一個信用卡號碼模式。這稱為數據有效性驗證

2.正則表達式可以實現文本替換;可以在文檔中使用一個正則表達式來標識特定文字,然後可以全部將其刪除,或者替換為別的文字

3.正則表達式可以根據模式匹配從字符串中提取一個子字符串;可以用來在文本或輸入字段中查找特定文字

正則表達式基本語法

一個正則表達式就是由普通字符(例如字符 a 到 z)和特殊字符(稱為元字符)組成的文字模式;該模式描述在查找文字主體時待匹配的一個或多個字符串;正則表達式作為一個模板,將某個字符模式與所搜索的字符串進行匹配

如何創建正則表達式

使用構造函數定義正則表達式,注意大小寫,否則就會不起作用;由於構造函數的參數是一個字符串,也可以是兩個斜杠的方式定義,遇到一些特殊字符就需要使用\進行轉義;通過雙斜杠的方式定義同樣的正則表達式:

1.通過字麵量創建:var 變量名=/表達式/模式修飾符

eg:var re = /a/gi;

2.通過構造函數創建:new RegExp("表達式","模式修飾符")

eg:var re = new RegExp("a","gi");//匹配所有的a或A

通過構造函數創建需要更多的轉義字符\

RegExp構造函數第一個參數為正則表達式的文本內容,而第一個參數則為可選項標誌.標誌可以組合使用

g (全文查找) 
i (忽略大小寫) 
m (多行查找)

正則表達式基本語法

兩個特殊的符號'^'和'$';他們的作用是分別指出一個字符串的開始和結束。

例子如下:

"^The":表示所有以"The"開始的字符串("There","The cat"等);

"of despair$":表示所以以"of despair"結尾的字符串;

"^abc$":表示開始和結尾都是"abc"的字符串——嗬嗬,隻有"abc"自己了;

"notice":表示任何包含"notice"的字符串。

象最後這個例子,如果你不使用兩個特殊字符,你就在表示要查找的串在被查找串的任意部分——你並不把它定位在某一個頂端。

其它還有'*','+'和'?'這三個符號,表示一個或一序列字符重複出現的次數;它們分別表示“沒有或更多”,“一次或更多”還有“沒有或一次”。

下麵是幾個例子:

"ab*":表示一個字符串有一個a後麵跟著零個或若幹個b("a", "ab", "abbb",……);

"ab+":表示一個字符串有一個a後麵跟著至少一個b或者更多;

"ab?":表示一個字符串有一個a後麵跟著零個或者一個b;

"a?b+$":表示在字符串的末尾有零個或一個a跟著一個或幾個b。

你也可以使用範圍,用大括號括起,用以表示重複次數的範圍。

"ab{2}":表示一個字符串有一個a跟著2個b("abb");

"ab{2,}":表示一個字符串有一個a跟著至少2個b;

"ab{3,5}":表示一個字符串有一個a跟著3到5個b。

請注意,你必須指定範圍的下限(如:"{0,2}"而不是"{,2}")。

還有,你可能注意到了,'*','+'和'?'相當於"{0,}","{1,}"和"{0,1}"。

還有一個'|',表示“或”操作:

"hi|hello":表示一個字符串裏有"hi"或者"hello";

"(b|cd)ef":表示"bef"或"cdef";

"(a|b)*c":表示一串"a""b"混合的字符串後麵跟一個"c";

'.'可以替代任何字符:

"a.[0-9]":表示一個字符串有一個"a"後麵跟著一個任意字符和一個數字;

"^.{3}$":表示有任意三個字符的字符串(長度為3個字符);

方括號表示某些字符允許在一個字符串中的某一特定位置出現:

"[ab]":表示一個字符串有一個"a"或"b"(相當於"a|b");

"[a-d]":表示一個字符串包含小寫的'a'到'd'中的一個(相當於"a|b|c|d"或者"[abcd]");

"^[a-zA-Z]":表示一個以字母開頭的字符串;

"[0-9]%":表示一個百分號前有一位的數字;

",[a-zA-Z0-9]$":表示一個字符串以一個逗號後麵跟著一個字母或數字結束。

你也可以在方括號裏用'^'表示不希望出現的字符,'^'應在方括號裏的第一位。

(如:"%[^a-zA-Z]%"表示兩個百分號中不應該出現字母)。

為了逐字表達,你必須在"^.$()|*+?{\"這些字符前加上轉移字符'\'。

請注意在方括號中,不需要轉義字符。

和正則表達式相關的方法和屬性

正則表達式對象的方法

正則表達式有3個方法:test()、exec() 以及 compile()

test():檢測給定的字符串是否滿足正則表達式,返回一個 Boolean 值,如果隻是單純的判斷被查找的字符串中是否存在,不需要其他的處理,可以使用compile,把正則表達式編譯為內部格式,從而執行得更快。

eg:

var patt1=new RegExp("e");
document.write(patt1.test("The best things in life are free")); //由於該字符串中存在字母 "e",以上代碼的輸出將是:true

exec():檢索字符串中的指定值,返回值是被找到的值;如果沒有發現匹配,則返回 null。

eg1:

var patt1=new RegExp("e");
document.write(patt1.exec("The best things in life are free")); //由於該字符串中存在字母 "e",以上代碼的輸出將是:e

您可以向 RegExp 對象添加第二個參數,以設定檢索。例如,如果需要找到所有某個字符的所有存在,則可以使用 "g" 參數 ("global")

在使用 "g" 參數時,exec() 的工作原理如下:

找到第一個 "e",並存儲其位置;如果再次運行 exec(),則從存儲的位置開始檢索,並找到下一個 "e",並存儲其位置

eg2:

var patt1=new RegExp("e","g");
do{
    result=patt1.exec("The best things in life are free");
    document.write(result);
}
while (result!=null) //由於這個字符串中6個 "e" 字母,代碼的輸出將是:eeeeeenull

compile():方法用於改變 RegExp;compile() 既可以改變檢索模式,也可以添加或刪除第二個參數。

eg:

var patt1=new RegExp("e");
document.write(patt1.test("The best things in life are free"));
patt1.compile("d");
document.write(patt1.test("The best things in life are free"));//由於字符串中存在 "e",而沒有 "d",以上代碼的輸出是:truefalse

正則表達式對象的屬性

source:返回正則表達式模式的文本複本,隻讀。

lastIndex:返回字符位置,它是被查找字符串中下一次成功匹配的開始位置。

1...1...9:返回九個在模式匹配期間找到的、最近保存的部分,隻讀。

input ($_):返回執行規範表述查找的字符串,隻讀。

lastMatch ($&):返回任何正則表達式搜索過程中的最後匹配的字符,隻讀。

lastParen ($+):如果有的話返回任何正則表達式查找過程中最後括的子匹配,隻讀。

leftContext ($`):返回被查找的字符串中從字符串開始位置到最後匹配之前的位置之間的字符,隻讀。

rightContext ($'),返回被搜索的字符串中從最後一個匹配位置開始到字符串結尾之間的字符,隻讀。

String對象一些和正則表達式相關的方法

match:找到一個或多個正則表達式的匹配。

replace:替換與正則表達式匹配的子串。

search:檢索與正則表達式相匹配的值。

split:把字符串分割為字符串數組。

RegExp對象實例的一些屬性

每個RegExp對象的實例具有lastIndex屬性,它是被查找字符串中下一次成功匹配的開始位置,默認值是-1。 lastIndex 屬性被 RegExp 對象的 exec 和 test 方法修改.並且它是可寫的;當匹配失敗(後麵沒有匹配),或lastIndex值大於字符串長度時,再執行exec等方法會將lastIndex設為0(開始位置)

RegExp對象的靜態屬性

multiline屬性返回正則表達式是否使用多行模式,這個屬性不針對某個正則表達式實例,而是針對所有正則表達式,並且這個屬性可寫.(IE與Opera不支持這個屬性)

使用元字符注意事項:元字符是正則表達式的一部分,當我們要匹配正則表達式本身時,必須對這些元字符轉義;下麵是正則表達式用到的所有元字符( [ { \ ^ $ | ) ? * + .

使用RegExp構造函數與使用正則表達式字麵量創建正則表達式注意點

既然雙重轉義這麼不友好,所以還是用正則表達式字麵量的聲明方式

另處,還有一些其它的預定義特殊字符,如下表所示:

字符 描述
\n 換行符
\r 回車符
\t 製表符
\f 換頁符(Tab)
\cX 與X對應的控製字符
\b 退格符(BackSpace)
\v 垂直製表符
\0 空字符("")

字符類 ---〉簡單類,反向類,範圍類,組合類,預定義類

下麵是正則表達式中的預定義類

代碼 等同於 匹配
. IE下[^\n],其它[^\n\r] 匹配除換行符之外的任何一個字符
\d [0-9] 匹配數字
\D [^0-9] 匹配非數字字符
\s [ \n\r\t\f\x0B] 匹配一個空白字符
\S [^ \n\r\t\f\x0B] 匹配一個非空白字符
\w [a-zA-Z0-9_] 匹配字母數字和下劃線
\W [^a-zA-Z0-9_] 匹配除字母數字下劃線之外的字符

貪婪量詞與惰性量詞

?用貪婪量詞進行匹配時,它首先會將整會字符串當成一個匹配,如果匹配的話就退出,如果不匹配,就截去最後一個字符進行匹配,如果不匹配,繼續將最後一個字符截去進行匹配,直到有匹配為止。直到現在我們遇到的量詞都是貪婪量詞
?用惰性量詞進行匹配時,它首先將第一個字符當成一個匹配,如果成功則退出,如果失敗,則測試前兩個字符,依次增加,直到遇到合適的匹配為止

惰性量詞僅僅在貪婪量詞後麵加個"?"而已,如"a+"是貪婪匹配的,"a+?"則是惰性的

最後更新:2017-04-24 13:00:41

  上一篇:go js常用正則表達式
  下一篇:go 考察數據科學家數據降維知識的40道題,快來測測吧(附答案)