js謎之正則表達式

前言

很久以前就說要寫一篇正則表達式的文章,正則表達式老是記了又忘,忘了再記,記了再忘,卒。
言歸正傳,今天終於要研究一下這個謎同樣的正則表達式了。其實正則表達式並不難(真的嗎?orz)
本文轉自本人博客:http://lsxj615.com/2016/08/15...正則表達式

爲何要用正則表達式

在學習以前,咱們須要弄明白,到底何時須要用到正則表達式,正則表達式的用途到底是什麼?
好比說,你正在搜索一個文件,這個文件裏面包含單詞car(不區分大小寫),可是呢你又不想把包含字符串car的其餘單詞(例如carry)也一塊兒找出來,那麼這個時候你就可使用正則表達式來幫你解決問題。固然,這只是衆多場景中的一種。正則表達式功能強大,能夠幫你解決各類匹配文本問題。又或者表單驗證的方式,也可使用正則表達式來解決。express

正則表達式是什麼

簡單來講,正則表達式就是字符串,是用來匹配和處理文本的字符串。用正則表達式語言建立的。數組

正則表達式的語法

匹配字符

  • .(英文句號):匹配任何一個單個字符瀏覽器

  • []:匹配集合內多個字符中的某個字符
    e.g. [ns]a --> 匹配 na 或sa函數

  • [-]:匹配該區間內的字符
    e.g. [a-z] , [0-9]工具

  • ^ 取非匹配:除了該字符集內的字符,均可以匹配。只有當^出如今[]之間,且緊跟在[後面,才能發揮取非的做用。
    e.g. [^0-9] 匹配非數字的字符學習

使用元字符

元字符:在正則表達式中有特殊含義的字符。若須要表示該字符自己,需使用\轉義。code

  • \d 任何一個數字字符,至關於[0-9]對象

  • \D 任何一個非數字字符,至關於1ip

  • \w 任何一個字母數字字符或下劃線字符,至關於[a-zA-Z0-9_]

  • \W 任何一個非字母數字字符或非下劃線字符,至關於2

  • \s 任何一個空白字符,等價於[fnrtv]

  • \S 任何一個非空白字符,等價於3

總而言之,小寫字母與大寫字母都是相反的,因此記住小寫字母的含義,大寫字母則是對應的取非含義。

重複匹配

  • ? 0個或1個字符
    e.g. [0-9]? 出現0次或一次,且最多隻能出現1次數字。

  • + 一個或多個字符
    e.g. [0-9]+ 表示一個或多個連續的數字

  • * 0個或多個字符
    e.g. [0-9]* 連續出現0次貨屢次的數字

  • {n} 設置一個精確的重複的值
    e.g. [0-9]{3} 三個數字

  • {min,max} 設置重複次數的最小值和最大值
    e.g. [0-9]{2,4} 最少2個數字,最多4個數字

  • {min, } 設置重複次數的最小值
    e.g. [0-9]{2,} 最少2個數字

懶惰型匹配

爲了防止出現重複匹配形成的過分匹配,由於*+都是「貪婪型」元字符,它們在進行匹配時會盡量從一段文本的開頭一直匹配到這段文本的末尾,而不是碰到第一個匹配就結束。

那麼這個時候就須要使用"懶惰型"。僅需在貪婪型元字符後加上?便可。如:*?,+?,{n,}?

位置匹配

  • \b 單詞邊界

  • \B 非單詞邊界。查找先後都有多餘空格的連字符。

  • ^ 字符串開頭。出如今字符集合的外面且位於一個模式的開頭,^匹配字符串的開頭

  • $ 字符串結尾


Javascript中的正則表達式

ECMAScript經過RegExp類型來支持正則表達式。

var expression = / pattern / flags;

其中pattern能夠是任何簡單或複雜的正則表達式。
flags用來標明正則表達式的行爲。以下所示:

  • g : 全局模式。模式應用於全部的字符串,不是在發現第一個匹配項後就當即中止的。

  • i : 不區分大小寫。正則表達式默認是區別大小寫的。i則是忽略大小寫

  • m : 表示多行模式,也就是說到達一行文本末尾的時候還會繼續查找下一行中是否存在與模式匹配的項。

建立正則表達式的方式

  • 字面量形式來定義
    var pattern = /sxj/i;

  • 使用RegExp構造函數
    var pattern = new RegExp("sxj", "i");

那麼這兩種方式的區別除了形式不同,還有一個差異在於:
ECMAScript 3中,正則表達式字面量始終會共享同一個RegExp實例;而使用構造函數建立的每個實例都是一個實例。

不過!【敲黑板!】ECMAScript 5明確規定了,使用正則表達式字面量必須想直接調用RegExp構造函數同樣,每次都建立新的RegExp實例。而各大瀏覽器也對此進行了修改。

RegExp實例

實例屬性

  • global: 布爾值,表示是否設置了g標誌

  • ignoreCase: 布爾值,表示是否設置了i標誌

  • multiline: 布爾值,表示是否設置了m標誌

  • lastIndex:整數,表示開始搜索下一個匹配項的字符位置,從0開始。

  • source: 正則表達式的字符串表示。按照字面量形式返回。

實例方法

exec()
pattern.exec(text);

查找text中的匹配項。

//例子
var pattern = /sxj/i;
var text = "sxj is a good student sxj haha";
console.log(pattern.exec(text));
//["sxj", index: 0, input: "sxj is a good student sxj haha"]
var pattern2 = /shi/i;
console.log(pattern2,exec(text));//null

從上述例子能夠發現,若找到,則返回一個數組,該數組包含第一個匹配項,除此以外,還有兩個屬性:index(匹配項在字符串中的位置),input(應用正則表達式的字符串)。若沒有匹配項返回null

對於exec而言,不管是否設置g全局標誌,每次也只會返回一個匹配項。可是若是在同一個字符串上屢次調用,設置了g標誌則會繼續查找新的匹配項,而沒有設置的話只會返回第一個匹配項信息。除此以外,pattern的lastIndex屬性在全局模式會增長,非全局模式始終不變。

test()
pattern.test(text);

查看目標字符串與該模式是否匹配。匹配返回true,不然返回false。

String中的正則表達式

match()
text.match(pattern);

match匹配一個字符串和一個正則表達式。若沒有g標識,則結果與pattern.exec(text)相同。如有g標誌,則返回一個包含全部匹配的數組。

search()
text.search(pattern);

若找到匹配,返回第一個匹配的首字符位置。若沒有找到返回-1。
此方法會忽略g標識,且沒有position參數。

replace()
string.replace(searchValue, replaceValue);

searchValue能夠是一個字符串或一個正則表達式對象。如果一個字符串,只會在第一次出現的地方被替換。如果一個正則表達式,如有g標誌則替換全部匹配之處,若沒有則只替換第一個匹配之處。

總結

正則表達式是個很是好用的工具,若掌握了可達到事半功倍的效果。好好學喲~


  1. 0-9
  2. a-zA-Z0-9_
  3. fnrtv
相關文章
相關標籤/搜索