JS中的正則表達式

上文傳送門:初探正則表達式

正則表達式是一個形貌字符形式的對象,JavaScriptRegExp 類示意正則表達式,StringRegExp 都定義了要領,後者運用正則表達式舉行壯大的形式婚配和文本檢索於替代功用。JavaScript 的正則表達式語法是 Perl5 的正則表達式語法的子集。

JS中正則表達式的定義

JavaScript 中的正則表達式用RegWxp對象示意,能夠運用RegExp()組織函數來建立RegExp對象,不過RegExp對象更多的是經由過程一種特別的直接量語法來建立。就像經由過程引號包裹字符的體式格局來定義字符串直接量一樣,正則表達式直接量定義為包括在一對斜杠(/)之間的字符,比方:

var someReg  = /s$/ 
var someReg2 = new RegExp("s$")

實在,這兩個表達式是等價的,都婚配以字母s末端的字符串,只不過第一個以直接量定義,第二個以正則表達式定義。

js中正則表達式的修飾符

修飾符申明
i實行不辨別大小寫的婚配
g實行一個全局婚配,即找到一切婚配而不是找到一個就住手
m多行婚配形式 ^ 婚配一行的開首和字符串的開首 $ 婚配行的完畢和字符串的完畢

用於婚配形式的String要領

String 支撐4種運用正則表達式的要領。

1. search()

"JavaScript".search(/script/i);

search() 的參數是一個正則表達式,返回第一個與之婚配的字串的肇端位置,假如到不到婚配的字串,它將返回 -1,假如它的參數不是正則表達式,則起首會經由過程RegExp組織函數將他轉化成正則表達式,它不支撐全局搜刮,因為它疏忽正則表達式中的修飾符 g。上面的表達式將返回 4

2. replace()

text.replace(/javascript/gi, "JavaScript");

replace() 用來實行檢索和替代操縱。个中第一個參數是一個正則表達式,第二個參數是要舉行替代操縱的字符串。這個要領會對挪用它的字符串舉行檢索,運用指定的形式來婚配。假如 replace() 的第一個參數是一個字符串,那末它將直接搜刮這個字符串,而不是和 search() 一樣先經由過程 RegExp()將它轉換成正則表達式。上面的表達式將文本中一切的 javascript (不辨別大小寫)一致替代為 JavaScript

3. march():

"1 and 2 and 3".match(/\d+g);

match() 要領是最經常使用的String正則表達式要領。它唯一的參數就是一個正則表達式,返回的是一個婚配效果構成的數組。假如該表達式設置了修飾符 g,則該要領懺悔的數組中包括了字符串中一切婚配效果。假如這個這個正則表達式沒有設置修飾符 g,它只檢索第一個婚配。然則縱然它不是全局婚配,它也返回一個數組,在這類情況下,數組的第一個元素就是婚配的字符串,剩下的元素則是正則表達式頂用圓括號擴起來的子表達式。上面代碼返回 ["1","2","3"]

4. split()

"123,456,789".split(",");

這個要領將挪用他的字符串拆分紅一個字串構成的數組,運用的分隔符是 split() 的參數,它的參數也能夠是一個正則表達式。上面的代碼返回 ["123","456","789"]

RegExp對象

除了 RegExp() 組織函數之外,RegExp 對象還支撐三個要領和一些屬性。

RegExp()組織函數能夠有兩個字符串參數,第一個參數包括正則表達式的主體部份。須要注重的是不論是字符串直接量照樣正則表達式,都是用 \ 作為轉義字符的前綴,因而當給組織函數傳入一個字符串表述的正則表達式時,必需要將 \ 替代成 \\。假如供應第二個參數,它就制訂正則表達式的修飾符。

var thisReg = new RegExp("\\d{5}","g");

RegExp的屬性

  1. source: 只讀的字符串,包括正則表達式的文本。
  2. global: 只讀的布爾值,申明這個正則表達式是不是帶有修飾符 g
  3. ignoreCase: 只讀的布爾值,申明這個正則表達式是不是帶有修飾符 i
  4. multiline: 只讀的布爾值,申明這個正則表達式是不是帶有修飾符 m
  5. lastIndex: 可讀寫的整數,假如這個正則表達式帶有修飾符 g ,這個屬性儲存在悉数字符串中下次檢索的最先位置,這個屬性會被 exec()test() 要領用到。

RegExp的要領

RegExp對象定義了兩個用於實行形式婚配操縱的要領。

1. exec()

它與我們之前引見的 match() 相似,只是它的參數是一個字符串,而 match() 的參數是一個RegExp對象。

exec() 對一個指定的字符串實行婚配檢索。假如它沒有找點任何婚配,它就返回 null,然則假如他找到一個婚配,它將返回一個數組,這個數組第一個元素包括的是與正則表達式相婚配的字符串,餘下的就是正則表達式括號內的子表達式。

match() 差別,不論正則表達式是不是具有全局修飾符 gexec() 都邑返回一樣的數組。當挪用 exec() 的正則表達式對象具有修飾符 g 的時刻,它把當前正則表達式的 lastindex 屬性設置為緊挨着婚配字串的字符位置。當同一個字符串第二次挪用 exec() 的時刻,他將會從 lastIndex 所指導的字符位置最先檢索。假如沒有任何婚配效果,他將會把 lastIndex 設置為 0(我們也能夠在任何時刻舉行設置)。

2. test()

挪用 test() 和挪用 exec() 等價,當 exec() 的返回效果不是 null 的時刻,test() 返回 true。因為這類等價性,當一個全局表達式挪用 test() 時,它的行動和 exec() 一樣。

ES6中正則的擴大

RegExp組織函數

在ES5中,RegExp() 只能接收字符串作為參數,ES6許可其直接接收正則表達式作為參數。

let regex = new RegExp(/xyz/i)

字符串的正則要領

ES6中將字符串對象的4個正則要領在言語內部悉數挪用 RegExp 的實例要領,使得一切與正則有關的要領悉數都定義在了 RegExp 對象上。

String.prototype.match 挪用 RegExp.prototype[Symbol.match]

u修飾符

ES6對正則表達式增加了 u 修飾符,寄義為“Unicode形式”,用來正確處理大於 \uFFFF 的Unicode字符。

y修飾符

ES6還為正則表達式添加了 y 修飾符。他的作用和 g 修飾符相似,也是全局婚配,后一次婚配都從上一次婚配勝利的下一位置最先。差別之處在於,g 修飾符只需盈餘位置中存在婚配就行,而 y 修飾符會確保婚配從盈餘的第一個位置最先。g 修飾符會疏忽不法字符, y 不會。

let s  = "aaa_aa_a";
let r1 = /a+/g;
let r2 = /a+/y;

r1.exec(s)  // ["aaa"]
r2.exec(s)  // ["aaa"]

r1.exec(s)  // ["aa"]
r2.exec(s)  // null

sticky屬性

y 修飾符對應,ES6的正則對象對了 sticky 屬性,用來示意是不是設置了 y 修飾符。

flags屬性

ES6為正則表達式新增了 flags 屬性,返回正則表達式的修飾符。

    原文作者:樓蘭小騎士
    原文地址: https://segmentfault.com/a/1190000014886269
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞