正則表達(dá)式擴(kuò)展

ES6擴(kuò)展

1.RegExp 構(gòu)造函數(shù)

  • ES5中克蚂,RegExp構(gòu)造函數(shù)的參數(shù)有兩種情況。
  var regex = new RegExp('xyz', 'i');
  // 等價于
  var regex = /xyz/i;

  var regex = new RegExp(/xyz/i);
  // 等價于
  var regex = /xyz/i;

  // 不允許眷细,報(bào)錯
  var regex = new RegExp(/xyz/, 'i');

ES6中膛虫,支持如上正則寫法

  new RegExp(/abc/ig, 'i')
  // 原有正則對象中的修飾符(flag)ig,將會被第二個參數(shù)i覆蓋

2.改變字符串正則方法的調(diào)用
match()、replace()、search()和split()

String.prototype.match 調(diào)用 RegExp.prototype[Symbol.match]
String.prototype.replace 調(diào)用 RegExp.prototype[Symbol.replace]
String.prototype.search 調(diào)用 RegExp.prototype[Symbol.search]
String.prototype.split 調(diào)用 RegExp.prototype[Symbol.split]

3.u 修飾符氛改,用來正確處理大于 \uFFFF的Unicode 字符
(1)點(diǎn)字符:除了換行符以外的任意單個字符帐萎,大于 \uFFFF 的 Unicode 字符無法識別

  var s = '??';
  /^.$/.test(s) // false
  /^.$/u.test(s) // true

(2) Unicode 字符表示法

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

(3) 量詞:正確識別碼點(diǎn)大于 0xFFFF 的 Unicode 字符

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

(4) \S 預(yù)定義模式,匹配所有非空白字符胜卤;影響同上

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

  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 修飾符,識別非規(guī)范的字符

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

4.RegExp.prototype.unicode 屬性:表示是否設(shè)置了u修飾符

  const r1 = /hello/;
  const r2 = /hello/u;
  r1.unicode // false
  r2.unicode // true  
  1. y 修飾符疆导,粘連(sticky)修飾符
    y 修飾符與g修飾符類似,也是全局匹配葛躏,后一次都從上一次匹配成功的下一個位置開始
    • g 修飾符:只要剩余位置中存在匹配即可
    • y 修飾符: 匹配必須從剩余的第一個位置開始澈段,不滿足返回 null

6.RegExp.prototype.sticky 屬性:表示是否設(shè)置了y修飾符

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

7.RegExp.prototype.flags 屬性:會返回正則表達(dá)式的修飾符

ES2018擴(kuò)展

8.s 修飾符:dotAll 模式

  • 引入s修飾符,使得.可以匹配任意單個字符
 // 匹配的是任意單個字符寫法
  /foo[^]bar/.test('foo\nbar')  // true

  // 上面的解決方案不太符合直覺
  /foo.bar/s.test('foo\nbar') // true

9.后行斷言
...
10.Unicode 屬性類
引入了一種新的類的寫法\p{...}和\P{...}舰攒,允許正則表達(dá)式匹配符合 Unicode 某種屬性的所有字符
語法如下:Unicode 屬性類要指定屬性名和屬性值

\p{UnicodePropertyName=UnicodePropertyValue}

\P{…}是\p{…}的反向匹配败富,即匹配不滿足條件的字符,這兩種類只對Unicode字符有效摩窃,使用時一定要加上U 修飾符

  // 匹配所有數(shù)字
  const regex = /^\p{Number}+$/u;
  regex.test('231???') // true
  regex.test('???') // true
  regex.test('ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ') // true

11.具名組匹配
正則表達(dá)式使用圓括號進(jìn)行組匹配

  const RE_DATE = /(\d{4})-(\d{2})-(\d{2})/;
  const matchObj = RE_DATE.exec('1999-12-31');
  const year = matchObj[1]; // 1999
  const month = matchObj[2]; // 12
  const day = matchObj[3]; // 31

為了便于閱讀與引用兽叮,引入了具名匹配

  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

語法如下:“具名組匹配”在圓括號內(nèi)部,模式的頭部添加“問號 + 尖括號 + 組名”(?<year>)猾愿,再通過exec 放回結(jié)果的groups 屬性引用該組名

解構(gòu)賦值和替換
解構(gòu)賦值

  let {groups: {one, two}} = /^(?<one>.*):(?<two>.*)$/u.exec('foo:bar');
  one  // foo
  two  // bar

替換:字符串替換時充择,使用$<組名>引用具名組

  let re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u;
  '2015-01-02'.replace(re, '$<day>/$<month>/$<year>')
  // '02/01/2015'

引用:如果要在正則表達(dá)式內(nèi)部引用某個“具名組匹配”,可以使用\k<組名>匪蟀、數(shù)字引用(\1)的寫法
....

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市宰僧,隨后出現(xiàn)的幾起案子材彪,更是在濱河造成了極大的恐慌,老刑警劉巖琴儿,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件段化,死亡現(xiàn)場離奇詭異,居然都是意外死亡造成,警方通過查閱死者的電腦和手機(jī)显熏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晒屎,“玉大人喘蟆,你說我怎么就攤上這事」穆常” “怎么了蕴轨?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長骇吭。 經(jīng)常有香客問我橙弱,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任棘脐,我火速辦了婚禮斜筐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛀缝。我一直安慰自己顷链,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布内斯。 她就那樣靜靜地躺著蕴潦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪俘闯。 梳的紋絲不亂的頭發(fā)上潭苞,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機(jī)與錄音真朗,去河邊找鬼此疹。 笑死,一個胖子當(dāng)著我的面吹牛遮婶,可吹牛的內(nèi)容都是我干的蝗碎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼旗扑,長吁一口氣:“原來是場噩夢啊……” “哼蹦骑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起臀防,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤眠菇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后袱衷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捎废,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年致燥,在試婚紗的時候發(fā)現(xiàn)自己被綠了登疗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嫌蚤,死狀恐怖辐益,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脱吱,我是刑警寧澤荷腊,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站急凰,受9級特大地震影響女仰,放射性物質(zhì)發(fā)生泄漏猜年。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一疾忍、第九天 我趴在偏房一處隱蔽的房頂上張望乔外。 院中可真熱鬧,春花似錦一罩、人聲如沸杨幼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽差购。三九已至,卻和暖如春汉嗽,著一層夾襖步出監(jiān)牢的瞬間欲逃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工饼暑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稳析,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓弓叛,卻偏偏與公主長得像彰居,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子撰筷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 前面的話 正則表達(dá)式是javascript操作字符串的一個重要組成部分陈惰,但在以往的版本中并未有太多改變。然而毕籽,在E...
    CodeMT閱讀 925評論 0 2
  • RegExp構(gòu)造函數(shù) es5中奴潘,RegExp構(gòu)造函數(shù)有兩種參數(shù) 第一個參數(shù)為字符串,第二個參數(shù)為正則表達(dá)式的修飾符...
    焦邁奇閱讀 787評論 0 0
  • 一掘剪、RegExp 構(gòu)造函數(shù) 1平委、ES5的寫法: 正確的: 不正確的: 參數(shù)是一個正則表示式,這時會返回一個原有正則...
    夜幕小草閱讀 592評論 0 0
  • 1. 概述 正則表達(dá)式(regular expression)是一種表達(dá)文本模式(即字符串結(jié)構(gòu))的方法夺谁,有點(diǎn)像字符...
    JRG_Orange閱讀 2,531評論 0 50
  • 1. 昨天晚上回老家過年的小雪回來了廉赔,給我們講述她前兩天經(jīng)歷的一次奇葩相親。 大年初三那天一大早小雪的一個表舅給她...
    匹諾曹JS閱讀 817評論 25 27