成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

正則表達式巧用 Unicode 匹配特殊字符

rubyshen / 1942人閱讀

摘要:正則表達式巧用匹配特殊字符作者原文章首先聲明,本文所有的代碼都是在下面運行,需要修改之后才能運行,但是本文沒有涉及到太多的新特性,而且由于對修飾符不支持,最后的實現(xiàn)也基本是用的知識寫的代碼。

正則表達式巧用 Unicode 匹配特殊字符

作者 @zwhu

原文章 @github

首先聲明,本文所有的代碼都是在 ES6 下面運行,ES5需要修改之后才能運行,但是本文沒有涉及到太多的ES6新特性,而且由于v8對u修飾符不支持,最后的實現(xiàn)也基本是用ES5的知識寫的代碼。

最初我只是想記錄下正則表達式用unicode的方式來匹配特殊字符,寫著寫著發(fā)現(xiàn) v8 對 u 修飾符的不支持,又轉(zhuǎn)而去研究怎么轉(zhuǎn)換字符串到utf-16的格式,在研究怎么轉(zhuǎn)換的過程中發(fā)現(xiàn)ES5的正則對 unicode 編碼單元 > 0x10000 的字符串不支持,再轉(zhuǎn)而去實現(xiàn)了一遍對大于 0x10000 的字符串的轉(zhuǎn)換,特此記錄。

之前有遇到過一個實用正則表達式匹配特殊字符的需求,例如一段文本 "ab*cd$你好我也好] seg$me*ntfault hello,world",用戶可以選擇用 * 或者 $ 來分割字符串。

在javascript中,$* 都是預(yù)定義的特殊字符,不能直接寫在正則表達式中,而需要轉(zhuǎn)義,寫成 /$/或者/*/。
我們需要根據(jù)用戶的選擇來寫正則表達式,封裝成一個函數(shù)就是:

function reg(input) {
    return new RegExp(`${input}`)
}

這種寫法初看上去很美好,將字符都轉(zhuǎn)義之后遇到一些特殊的字符可以匹配,然而現(xiàn)實是殘酷的:當(dāng)用戶輸入的是n或者t這一類的字符的話,返回的正則表達式為/ /或者/ /,匹配的就是所有的制表符,這就違背了用戶的初衷。

通常有一種寫法就是把所有需要轉(zhuǎn)義的特殊字符都列出來,然后再逐一匹配,這種寫法很耗費精力,而且可能因為沒有統(tǒng)計到的特殊字符而出現(xiàn)漏匹配的情況。

這個時候unicode就隆重登場了,在 JavaScript 中,我們也可以用unicode來表示一個字符,例如 "a" 可以寫成"u{61}", "你" 也可以寫成 "u{4f60}"。

關(guān)于unicode的介紹大家可以看 Unicode與JavaScript詳解

ES5中提供了 charCodeAt() 方法來返回指定索引處字符的 Unicode 數(shù)值,但是 Unicode 編碼單元 > 0x10000 的除外,ES2015 中又增加了一個新的方法 codePointAt() 可以返回大于 0x10000 字符串的數(shù)值。返回的數(shù)值是十進制的,此時我們還需要通過toString(16)轉(zhuǎn)成16進制。
封裝之后的函數(shù)如下

function toUnicode(s) {
    return `u{${s.codePointAt().toString(16)}}`
}

toUnicode("$") -> "u{24}"

重新封裝reg函數(shù)為

function reg(input) {
    return new RegExp(`${toUnicode(input)}`, "u")
}

其實寫到這里,我希望是對的,但是很不幸,V8 不支持 RegExp 的 u 修飾符。V8支持的話,寫到這里就應(yīng)該結(jié)束了,沒關(guān)系,這里只是提供一種用unicode的方式來轉(zhuǎn)義特殊字符的思想。

雖然v8不支持u修飾符,作為一個有追求的碼農(nóng),當(dāng)然不能止步于此,我們也可以使用其他方法繼續(xù)把這個完善

function toUnicode(s) {
  var a = `u${utf(s.charCodeAt(0).toString(16))}`
  if(s.charCodeAt(1))
    a = `${a}u${utf(s.charCodeAt(1).toString(16))}` 
  return a      
}

function utf(s) {
    return Array.from("00").concat(Array.from(s)).slice(-4).join("")
}

// 這里用var而沒有用let聲明,是因為這些代碼直接復(fù)制到 chrome 的控制臺下就可以看到執(zhí)行結(jié)果
// 測試一下
// toUnicode("a")   --> "u0061"
// toUnitcode("?")  --> "ud842udfb7"

function reg(input) {
    return new RegExp(`${toUnicode(input)}`)
}
// 再測試一下
reg("$").test("$") --> true

寫完啦,看到最后的同學(xué),如果覺得對你有幫助的話,就點個推薦唄。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85992.html

相關(guān)文章

  • Python標(biāo)準(zhǔn)庫---19、文本處理服務(wù):re正則達式操作

    摘要:正則表達式使用反斜杠來表示特殊形式,或者把特殊字符轉(zhuǎn)義成普通字符。解決辦法是對于正則表達式樣式使用的原始字符串表示法在帶有前綴的字符串字面值中,反斜杠不必做任何特殊處理。為了避免警告,需要將它們用反斜杠轉(zhuǎn)義。 上一篇文章:Python標(biāo)準(zhǔn)庫---18、文本處理服務(wù):string 常見的字符串操作下一篇文章: 這個模塊提供了與 Perl 語言類似的正則表達式匹配操作。 模式和被搜索的字...

    jcc 評論0 收藏0
  • re模塊和字符串處理

    摘要:插入符號匹配字符串的開頭,并且在模式也匹配換行后的首個符號。,和修飾符都是貪婪的它們在字符串進行盡可能多的匹配。如果正則式希望找到,它將會匹配整個字符串,而不僅是。用于表示一個字符集合。標(biāo)記應(yīng)該在表達式字符串首位表示。 re模塊和字符串處理 對于簡單的匹配,通常有str.find(),str.endswith(), str.startswith() >>>text = abcd >>>...

    lmxdawn 評論0 收藏0
  • JavaScript 中的正則達式

    摘要:正則表達式的意義中的正則表達式使用表示,可以使用構(gòu)造函數(shù)來創(chuàng)建對象,不過對象更多的是通過一種特殊的直接量語法來創(chuàng)建。用構(gòu)造函數(shù)也可以定義一個與之等價的正則表達式,代碼如下正則表達式的模式規(guī)則是由一個字符序列組成的。 正則表達式的模式匹配 正則表達式(regular expression)是一個描述字符模式的對象。javascript的RegExp對象表示正則表達式,String和Reg...

    _Dreams 評論0 收藏0
  • Python 正則達式

    摘要:今天就專門看看正則表達式。下面是一個正則表達式最簡單的使用例子。這個例子使用了正則表達式模塊的函數(shù),它會返回所有符合模式的列表。查詢標(biāo)志讓正則表達式具有不同的行為。,按給定正則表達式分割字符串。,正則表達式中捕獲組的數(shù)量。 最近研究Python爬蟲,很多地方用到了正則表達式,但是沒好好研究,每次都得現(xiàn)查文檔。今天就專門看看Python正則表達式。本文參考了官方文檔 re模塊。 模式 首...

    FrancisSoung 評論0 收藏0
  • Python正則達式很難?一篇文章搞定他,不是我吹!

    摘要:正則表達式語法字符與字符類特殊字符以上特殊字符要想使用字面值,必須使用進行轉(zhuǎn)義字符類包含在中的一個或者多個字符被稱為字符類,字符類在匹配時如果沒有指定量詞則只會匹配其中的一個。 1. 正則表達式語法 1.1 字符與字符類 1 特殊字符:.^$?+*{}| 以上特殊字符要想使用字面值,必須使用進行轉(zhuǎn)義 2 字符類 1. 包含在[]中的一個或者多個字符被稱為字符類,字符類在匹配時如果沒有指...

    dcr309duan 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<