正則表達式

正則表達式[\w]+,\w+,[\w+] 三者有何區別:
[\w]+和\w+沒有區別,都是匹配數字和字母下劃線的多個字符;
[\w+]表示匹配數字、字母、下劃線和加號自己字符;

git

[]github

表示數組而非排列,即不按固定次序位置排列;
在[]內的字符能夠任意次序出現。

[ABC]+ 
能夠匹配"AAABBBCCC,BBBAAACCC,BACCBACAACBAC,...",不是必定按固定A....B....C...的次序排列。

[\w./-+]+正則表達式

是匹配\w [0-9a-zA-Z_] 或 . 或 / 或 - 或 + 字符;數組

在[./-+]內均表示字符自己;函數

在[]+外表示{1,}至少1次或屢次;編碼

在[.]內點,不是任意字符的意思,就是匹配點.字符自己,點.能夠不須要加反斜槓\.。spa

在[]內特殊字符,表示匹配特殊字符自己,不須要加反斜槓,code

在[]外特殊字符,表示匹配特殊字符自己,必需要加反斜槓。regexp

 

ES6新增正則表達式字符對象

(1)點字符

點(.)字符在正則表達式中,含義是除了換行符之外的任意單個字符。對於碼點大於0xFFFF的 Unicode 字符,點字符不能識別,必須加上u修飾符。

var s = '𠮷';

/^.$/.test(s) // false
/^.$/u.test(s) // true

 

上面代碼表示,若是不添加u修飾符,正則表達式就會認爲字符串爲兩個字符,從而匹配失敗。

(2)Unicode 字符表示法

ES6 新增了使用大括號表示 Unicode 字符,這種表示法在正則表達式中必須加上u修飾符,才能識別當中的大括號,不然會被解讀爲量詞。

/\u{61}/.test('a') // false
/\u{61}/u.test('a') // true
/\u{20BB7}/u.test('𠮷') // true

 

上面代碼表示,若是不加u修飾符,正則表達式沒法識別\u{61}這種表示法,只會認爲這匹配61個連續的u

(3)量詞

使用u修飾符後,全部量詞都會正確識別碼點大於0xFFFF的 Unicode 字符。

/a{2}/.test('aa') // true
/a{2}/u.test('aa') // true
/𠮷{2}/.test('𠮷𠮷') // false
/𠮷{2}/u.test('𠮷𠮷') // true

 

(4)預約義模式

u修飾符也影響到預約義模式,可否正確識別碼點大於0xFFFF的 Unicode 字符。

/^\S$/.test('𠮷') // false
/^\S$/u.test('𠮷') // true

 

上面代碼的\S是預約義模式,匹配全部不是空格的字符。只有加了u修飾符,它才能正確匹配碼點大於0xFFFF的 Unicode 字符。

利用這一點,能夠寫出一個正確返回字符串長度的函數。

function codePointLength(text) {
  var result = text.match(/[\s\S]/gu);
  return result ? result.length : 0;
}

var s = '𠮷𠮷';

s.length // 4
codePointLength(s) // 2

 

(5)i 修飾符

有些 Unicode 字符的編碼不一樣,可是字型很相近,好比,\u004B\u212A都是大寫的K

/[a-z]/i.test('\u212A') // false
/[a-z]/iu.test('\u212A') // true

 

上面代碼中,不加u修飾符,就沒法識別非規範的K字符。

(6)y 修飾符

y修飾符的做用與g修飾符相似,也是全局匹配,後一次匹配都從上一次匹配成功的下一個位置開始。不一樣之處在於,g修飾符只要剩餘位置中存在匹配就可,而y修飾符確保匹配必須從剩餘的第一個位置開始,這也就是「粘連」的涵義。

var s = 'aaa_aa_a';
var r1 = /a+/g;
var r2 = /a+/y;

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

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

(7)sticky屬性

y修飾符相匹配,ES6 的正則對象多了sticky屬性,表示是否設置了y修飾符。

var r = /hello\d/y;
r.sticky // true

(7)flags屬性

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

// ES5 的 source 屬性
// 返回正則表達式的正文
/abc/ig.source
// "abc"

// ES6 的 flags 屬性
// 返回正則表達式的修飾符
/abc/ig.flags
// 'gi'

 

(7)s修飾符:dotAll模式

正則表達式中,點(.)是一個特殊字符,表明任意的單個字符,可是行終止符(line terminator character)除外。

如下四個字符屬於」行終止符「。

  • U+000A 換行符(\n
  • U+000D 回車符(\r
  • U+2028 行分隔符(line separator)
  • U+2029 段分隔符(paragraph separator)
/foo.bar/.test('foo\nbar')
// false

 

上面代碼中,由於.不匹配\n,因此正則表達式返回false

可是,不少時候咱們但願匹配的是任意單個字符,這時有一種變通的寫法。

/foo[^]bar/.test('foo\nbar')
// true

 

這種解決方案畢竟不太符合直覺,因此如今有一個提案,引入/s修飾符,使得.能夠匹配任意單個字符。

/foo.bar/s.test('foo\nbar') // true

 

這被稱爲dotAll模式,即點(dot)表明一切字符。因此,正則表達式還引入了一個dotAll屬性,返回一個布爾值,表示該正則表達式是否處在dotAll模式。

const re = /foo.bar/s;
// 另外一種寫法
// const re = new RegExp('foo.bar', 's');

re.test('foo\nbar') // true
re.dotAll // true
re.flags // 's'

 

/s修飾符和多行修飾符/m不衝突,二者一塊兒使用的狀況下,.匹配全部字符,而^$匹配每一行的行首和行尾。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息