收藏本站 收藏本站
積木網首頁 - 軟件測試 - 常用手冊 - 站長工具 - 技術社區
首頁 > 正則表達式 > 正文

首頁 - PHP - 數據庫 - 操作系統 - 游戲開發 - JS - Android - MySql - Redis - MongoDB - Win8 - Shell編程 - DOS命令 - jQuery - CSS樣式 - Python - Perl

Access - Oracle - DB2 - SQLServer - MsSql2008 - MsSql2005 - Sqlite - PostgreSQL - node.js - extjs - JavaScript vbs - Powershell - Ruby

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

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

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

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

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

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

function reg(input) {

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

}

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

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

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

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

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

封裝之后的函數如下

function toUnicode(s) {

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

}

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

重新封裝reg函數為

function reg(input) {

    return new RegExp(`${toUnicode(input)}`, 'u')

}

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

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

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 的控制臺下就可以看到執行結果
// 測試一下
// toUnicode('a')  --> "u0061"
// toUnitcode('��') --> "ud842udfb7"
function reg(input) {
 return new RegExp(`${toUnicode(input)}`)
}
// 再測試一下
reg('$').test('$') --> true

以上內容就是積木網小編給大家分享的正則表達式之 Unicode 匹配特殊字符

收集整理ASP.NET中17種常用正則表達式
"^/d+$"http://非負整數(正整數+0)"^[0-9]*[1-9][0-9]*$"http://正整數"^((-/d+)(0+))$"http://非正整數(負整數+0)"^-[0-9]*[1-9][0-9]*$"http://負整數"^-/d+$"http://整數"^/d+(/./d+)$"http://非負浮點數(

Android中手機號、車牌號正則表達式大全
手機號手機名稱有GSM:表示只支持中國聯通或者中國移動2G號段(130、131、132、134、135、136、137、138、139、145、147、150、151、152、155、156、157、158、159、

Android正則表達式
要嚴格的驗證手機號碼,必須先要清楚現在已經開放了哪些數字開頭的號碼段,目前國內號碼段分配如下:移動:134、135、136、137、138、139、150、151、15

本周排行

更新排行

強悍的草根IT技術社區,這里應該有您想要的! 友情鏈接:b2b電子商務
Copyright © 2010 Gimoo.Net. All Rights Rreserved  京ICP備05050695號
手游棋牌游戏运营
攒劲甘肃麻将ios版 开奖直播现场311211 河北20选5开奖结果今天 天津时时五星走势园 香港赛马会官方 安徽时时平台注册码是什么意思 云南快乐10技巧 新重庆时时开奖结果记录 云南时时三星基本走势 北京赛pk10稳赢技巧 山西快3今天开奖结果 381818白小姐开奖 江西快三84期开奖 赛车pk拾现场直播视频 幸运28走势图看规律 广东时时qq群查找