ES6--正則表達式


創建正則表達式規則的四種方法

var regex = new RegExp('xyz', 'i');

var regex = new RegExp(/xyz/i);

var regex = new RegExp(/xyz/, 'i');

var regex = /xyz/i;
在es5中,RegExp構造函數的兩種傳參方式:第一種第一個參數是字符串,第二個參數為修飾符;第二種參數是一個正則表達式;

在es6中,RegExp構造函數允許第一個參數為正則表達式時,第二個為修飾符,覆蓋正則表達式中的修飾符。

 

字符串的四個正則方法

match()

replace()

search()

split()

 

u修飾符

在es6中,新增了一個u修飾符,為了處理碼點大於\uFFFF的Unicode字符(也就是說,會正確處理四個字節的UTF-16編碼);\uD83D\uDC2A是一個字符,但是es5不支持四個字節的UTF-16,會將其識別成兩個字符,導致第二行代碼可以正確匹配到;加了u修飾符之后,es6會將其識別成一個字符。

/^\uD83D/u.test('\uD83D\uDC2A') // false
/^\uD83D/.test('\uD83D\uDC2A') // true
處理碼點大於0xFFFF的Unicode字符時,要加上/u修飾符。
var s = '𠮷';

/^.$/.test(s) // false
/^.$/u.test(s) // true
若正則表達式是使用大括號表示的Unicode字符,也必須使用/u修飾符才可以識別,不然會被解釋為量詞。
/\u{61}/.test('a') // false
/\u{61}/u.test('a') // true
/\u{20BB7}/u.test('𠮷') // true
當使用u修飾符后,所有量詞都會正確識別碼點大於0xFFFF的Unicode字符。
/a{2}/.test('aa') // true
/a{2}/u.test('aa') // true
/𠮷{2}/.test('𠮷𠮷') // false
/𠮷{2}/u.test('𠮷𠮷') // true
預定義模式,\S是預定義模式,可以匹配所有非空字符,只有加了u修飾符,它才能正確匹配碼點大於0xFFFF的 Unicode 字符。
/^\S$/.test('𠮷') // false
/^\S$/u.test('𠮷') // true

i修飾符

有些 Unicode 字符的編碼不同,但是字型很相近,比如,\u004B與\u212A都是大寫的K,不加u修飾符,就無法識別非規范的K字符。
/[a-z]/i.test('\u212A') // false
/[a-z]/iu.test('\u212A') // true

RegExp.prototype.unicode 屬性

判斷正則是否為設置了u屬性

y修飾符

RegExp.prototype.sticky 屬性

判斷正則是否設置了y屬性

RegExp.prototype.flags 屬性

查看正則設置的所有屬性

s修飾符

.可以匹配任意單個字符(dotAll模式)

RegExp.prototype.dotAll 屬性

表示該正則表達式是否處在dotAll模式,也就是 是否是s修飾符。
 

先行斷言

/x(?=y)/ x只有在y前面才匹配
/\d+(?=%)/ 只匹配百分號之前的數字

先行否定斷言

/x(?!y)/ x只有不在y前面才匹配
/\d+(?!%)/ 只匹配不在百分號之前的數字
/\d+(?=%)/.exec('100% of US presidents have been male')  // ["100"]
/\d+(?!%)/.exec('that’s all 44 of them')                 // ["44"]

后行斷言

/(?<=y)x/ x只有在y后面才匹配
/(?<=\$)\d+/ 只匹配美元符號之后的數字

后行否定斷言

/(?<!y)x/ x只有不在y后面才匹配
/(?<!\$)\d+/ 只匹配不在美元符號后面的數字
/(?<=\$)\d+/.exec('Benjamin Franklin is on the $100 bill')  // ["100"]
/(?<!\$)\d+/.exec('it’s is worth about €90')                // ["90"]

Unicode屬性類

\p{...}和\P{...} 允許匹配符合Unicode某種屬性的所有字符,\P{…}是\p{…}的反向匹配,即匹配不滿足條件的字符。
/\p{Script=Greek}/u 指定匹配一個希臘字母
\p{UnicodePropertyName=UnicodePropertyValue} 指定屬性名和屬性值
對於某些屬性,可以只寫屬性名,或者只寫屬性值。
\p{UnicodePropertyName}
\p{UnicodePropertyValue}

// 匹配所有空格
\p{White_Space}

// 匹配各種文字的所有字母,等同於 Unicode 版的 \w
[\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]

// 匹配各種文字的所有非字母的字符,等同於 Unicode 版的 \W
[^\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]

// 匹配 Emoji
/\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation}|\p{Emoji}\uFE0F/gu

// 匹配所有的箭頭字符
const regexArrows = /^\p{Block=Arrows}+$/u;
regexArrows.test('←↑→↓↔↕↖↗↘↙⇏⇐⇑⇒⇓⇔⇕⇖⇗⇘⇙⇧⇩') // true

 

具名組匹配

具名組匹配(Named Capture Groups),允許為每一個組匹配指定一個名字,既便於閱讀代碼,又便於引用。
const RE_DATE = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;

const matchObj = RE_DATE.exec('1999-12-31');
const year = matchObj.groups.year; // 1999
const month = matchObj.groups.month; // 12
const day = matchObj.groups.day; // 31

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM