最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2015年09月29日 11:45:58   投稿:mrr  
本篇文章由腳本之家小編給大家分享正則表達式巧用 Unicode關鍵字 匹配特殊字符,感興趣的朋友一起學習吧

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

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

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

在javascript中, $ 和 * 都是預定義的特殊字符,不能直接寫在正則表達式中,而需要轉義,寫成 /\$/ 或者 /\*/ 。

我們需要根據(jù)用戶的選擇來寫正則表達式,封裝成一個函數(shù)就是:

復制代碼 代碼如下:

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

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

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

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

關于unicode的介紹大家可以看 Unicode與JavaScript詳解

ES5 中提供了 charCodeAt() 方法來返回指定索引處字符的 Unicode 數(shù)值,但是 Unicode 編碼單元 > 0x10000 的除外, ES2015 中又增加了一個新的方法 codePointAt() 可以返回大于 0x10000 字符串的數(shù)值。返回的數(shù)值是十進制的,此時我們還需要通過 toString(16) 轉成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支持的話,寫到這里就應該結束了,沒關系,這里只是提供一種用unicode的方式來轉義特殊字符的思想。

雖然v8不支持u修飾符,作為一個有追求的碼農(nó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聲明,是因為這些代碼直接復制到 chrome 的控制臺下就可以看到執(zhí)行結果
// 測試一下
// toUnicode('a')  --> "\u0061"
// toUnitcode('��') --> "\ud842\udfb7"
function reg(input) {
 return new RegExp(`${toUnicode(input)}`)
}
// 再測試一下
reg('$').test('$') --> true

以上內(nèi)容就是腳本之家小編給大家分享的正則表達式之 Unicode 匹配特殊字符

相關文章

  • PHP正則表達式的效率 回溯與固化分組

    PHP正則表達式的效率 回溯與固化分組

    上文中,我們聊到了一點關于PHP中(NFA PCRE)正則表達式匹配優(yōu)先量詞,忽略優(yōu)先量詞的匹配原理了。那么上文留下的問題,您的答案是什么呢?
    2011-04-04
  • JavaScript正則表達式驗證身份證號碼是否合法(兩種方法)

    JavaScript正則表達式驗證身份證號碼是否合法(兩種方法)

    正則表達式(regular expression)是一個描述字符模式的對象。下面通過本篇文章給大家介紹js正則表達式驗證身份證號碼是否合法,需要的朋友可以參考下本篇文章
    2015-09-09
  • 正則表達式實現(xiàn)最小匹配功能的方法

    正則表達式實現(xiàn)最小匹配功能的方法

    這篇文章主要介紹了正則表達式實現(xiàn)最小匹配功能的方法,結合具體實例形式分析了正則表達式最小匹配功能的原理與實現(xiàn)技巧,需要的朋友可以參考下
    2017-02-02
  • Hive中常用正則表達式的運用小結

    Hive中常用正則表達式的運用小結

    在實際的應用中,通常需要在一些復雜的、沒有規(guī)律的字符串中提取數(shù)據(jù),這時候就需要用到正則表達式了,這次講一下hive的正則表達式,感興趣的朋友跟隨小編一起看看吧
    2022-08-08
  • 正則表達式模式修飾符

    正則表達式模式修飾符

    下面列出了當前可用的正則表達式修飾符。括號中提到的名字是正則表達式內(nèi)部這些修飾符的名稱。 模式修飾符中的空格,換行符會被忽略,其他字符會導致錯誤
    2016-12-12
  • linux下關于正則表達式grep的一點總結

    linux下關于正則表達式grep的一點總結

    正則表達式(Regular Expression)是用于描述一組字符串特征的模式,用來匹配特定的字符串。通過特殊字符+普通字符來進行模式描述,從而達到文本匹配目的工具
    2020-04-04
  • PHP匹配多行的正則表達式分析

    PHP匹配多行的正則表達式分析

    PHP匹配多行的正則表達式分析,需要的朋友可以參考下,多用于采集替換等。
    2011-07-07
  • Java正則表達式入門基礎篇(新手必看)

    Java正則表達式入門基礎篇(新手必看)

    這篇文章給大家介紹java正則表達式入門基礎篇, 由于正則表達式是一個很龐雜的體系,所以我僅例舉些入門的概念,更多的請參閱相關書籍及自行摸索。感興趣的朋友一起跟著小編來看看吧
    2015-10-10
  • 用正則提取全部的匹配結果的代碼

    用正則提取全部的匹配結果的代碼

    正則獲取匹配的結果,使用match 獲取匹配結果數(shù)組但又不能獲取到子表達式匹配結果
    2011-06-06
  • 正則表達式分組與引用的使用

    正則表達式分組與引用的使用

    今天我們來講下正則中的分組與引用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評論

林周县| 孟津县| 滦南县| 麻江县| 兖州市| 抚宁县| 洪泽县| 綦江县| 页游| 郴州市| 阆中市| 临西县| 应用必备| 长垣县| 洛扎县| 贡嘎县| 澄江县| 文化| 福海县| 东丰县| 佛学| 高陵县| 博白县| 江门市| 定陶县| 抚顺市| 武川县| 惠水县| 平原县| 顺义区| 德令哈市| 新竹市| 罗定市| 含山县| 新竹县| 清远市| 垣曲县| 安顺市| 贵溪市| 吉林市| 荔浦县|