在此前的 《JS正则表达式--从入门到精分》 一文中,曾经较完整的介绍过 Javascript 中正则表达式的用法。...而从 ES6(ES2015) 开始,借助 Babel 等标志性的工具,JS 的发展似乎也不想重蹈 Flash 时代的无所作为,走上了每年一个小版本的快车道;在此过程中,正则表达式也陆续演化出一些新的特性...在 ES6 之前, JS 的字符串以 16 位字符编码(UTF-16)为基础。每个 16 位序列(相当于2个字节)是一个编码单元(code unit,可简称为码元),用于表示一个字符。...') //true /\uD83D/u.test('\uD83D\uDC2A \uD83D') //true 可以将码点放入正则的字符类中: /^[\uD83D\uDC2A]$/.test('\uD83D...//true,通过 u 修正 参考资料: 《JS正则表达式--从入门到精分》 https://mp.weixin.qq.com/s?
正则表达式中的Unicode 既然大Unicode(大于U+FFFF的)在JS中用两个小Unicode(代理对儿)来表示,那么自然会写出这样的正则表达式: > /[\uD83D\uDCA9-\uD83D...\uDE0A]/.test('') Uncaught SyntaxError: Invalid regular expression: /[\uD83D\uDCA9-\uD83D\uDE0A]/: Range...JS提供了u flag来解决这个问题: u Unicode; treat pattern as a sequence of Unicode code points /[\uD83D\uDCA9-\uD83D...\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69' // 肤色修饰,黑baby、白baby '' === '\ud83d\udc76...\ude0a\ud83c\udfff' === '' // 尝试人工合成新物种,失败 '\u0023\ufe0f\u20e3\u200d\ud83d\ude0a' === '#️⃣' '\ud83d\
用UTF-16表示就是”\uD83D\uDCA9″ UCS(Universal Character Set)通用字符集,是一个ISO标准,目前与Unicode可以说是等价的。...坑1——length属性 先看一个简单的例子: >”\uD83D\uDCA9″ === “?” >true >”?”.length >2 因为”?”...在JS的编码是”\uD83D\uDCA9″,而JS认为每16位(2字节)即表示一个字符,所以一坨大便是占2个字符的。...; // 1 坑2——反转字符串 js里怎么反转(reverse)字符串?...(\uD83D\uDCA9)通过上述方法反转时,变成\uDCA9\uD83D,不是一个合法的代理对(高低字节范围不同),同时,Unicode规定代理对范围内的码点不能单独出现,所以js只能用�表示了。
'\ud83d\udca9' // -> '' '' === '\ud83d\udca9' // -> true 由于 Javascript 字符串使用 utf-16 编码,所以可以正确将代理对 \ud83d...'\u0041' === '\u{41}' // -> true '\ud83d\udca9' === '\u{1f4a9}' // -> true 可以打开 Dev Tool 的 console 面板...ES6 对 Unicode 的支持 length 属性的问题,主要还是最初设计 JS 这门语言的时候,没有考虑到会有这么多字符,认为两个字节就完全可以满足。...String.prototype.normalize() 由于 JS 中将字符串理解成一串两个字节的码元序列,判断是否相等是根据序列的值来判断的。...所以两者虽然看上去一样,但码点不一样,所以 JS 相等判断结果为 false。
当然前端表单验证的插件很多,而且可配置性很高,使用起来也是得心应手,比如vee-validate、validate.js 当然这类插件很多我就不一一列举了,亲们可以自行百度。...我这里是想分享一下我拿到需求后通过原生js的处理方案,如有碰到类似需求的小伙伴可以借鉴一下,不足之处欢迎到公众号留言,我会积极改正。 ?...return false; } // 过滤表情 let ranges = ['\ud83c[\udf00-\udfff]', '\ud83d...[\udc00-\ude4f]', '\ud83d[\ude80-\udeff]']; let emojiPattern = new RegExp(ranges.join('|'
/^\uD83D/.test('\uD83D\uDC2A') // true /^\uD83D/u.test('\uD83D\uDC2A') // false 上面代码中,\uD83D\uDC2A 是一个四个字节的...let a = '\ud83d\udc36'; console.log(/^.$/.test(a)); // false console.log(/^.
这个表情就需要2个char,看如下代码 String testCode = “ab\uD83D\uDE03cd”; int length = testCode.length(); int count...128515 i:4 index: 3 codePoint: 99 i:5 index: 4 codePoint: 100 也就是按照codePointindex取字符,0取到a,1取到b,2取到\uD83D...,3取到c,4取到d; 按照String的index取字符,0取到a,1取到b,2取到\uD83D,3取到\uDE03,4取到c,5取到d。...\uDE03汉字”; 想处理emoji,那记录的下标就是2、3,最后和白名单下标比较后统一删除 如何区别char是一对还是单个 就之前的例子ab\uD83D\uDE03cd,换种写法\u0061\u0062...\uD83D\uDE0\u0063\u0064 程序是如何将\uD83D\uDE03解析成一个字符的呢。
下面是剔除表情字符串的代码片段 python2.7 下测试 import re emoji_pattern = re.compile( u"(\ud83d[\ude00-\ude4f])|"...# emoticons u"(\ud83c[\udf00-\uffff])|" # symbols & pictographs (1 of 2) u"(\ud83d[\u0000-\uddff...])|" # symbols & pictographs (2 of 2) u"(\ud83d[\ude80-\udeff])|" # transport & map symbols
\uD83D\uDC2A /^\uD83D/.test('\uD83D\uDC2A') // true /^\uD83D/u.test('\uD83D\uDC2A')...(ok)那么这里 $1指的就是ok 前瞻 前瞻 Lookahead 是RegExp匹配到规则的时候,向后检查是否符合断言,后顾JS目前不支持 (ES2018已经支持) 名称 正则 描述 正向前瞻 (?...// s 17 ---- 网上的帖子大多深浅不一,甚至有些前后矛盾,在下的文章都是学习过程中的总结,如果发现错误,欢迎留言指出~ 更新记录: 20180923:添加ES9的更新内容 工具库: JS
console.log(/^\uD83D/u.test('\uD83D\uDC2A')); // 输出: true console.log(/^\uD83D/.test('\uD83D\uDC2A'))...; // 输出: false 上面的代码中,\uD83D\uDC2A是一个四字节的UTF-16编码,代表一个字符。
= null) { Pattern emoji = Pattern.compile ("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\...ud83d\udfff]|[\u2600-\u27ff]",Pattern.UNICODE_CASE | Pattern .
编码方式 往数据库存一条记录: @Test public void testInsert() { User user = new User(); user.setUsername("\uD83D...其中username是\uD83D\uDE00 。 其实\uD83D\uDE00是一个emoji表情。
'x\uD83D\uDE80y'.length // 4 [...'...x\uD83D\uDE80y'].length // 3 上面代码的第一种写法,JavaScript 会将四个字节的 Unicode 字符,识别为 2 个字符,采用扩展运算符就没有这个问题。...function length(str) { return [...str].length; } length('x\uD83D\uDE80y') // 3 凡是涉及到操作四个字节的 Unicode...let str = 'x\uD83D\uDE80y'; str.split('').reverse().join('') // 'y\uDE80\uD83Dx' [...str].reverse()....join('') // 'y\uD83D\uDE80x' 上面代码中,如果不用扩展运算符,字符串的reverse()操作就不正确。
类似js中的或,又称分支条件。 / 正则表达式模式的开始或结尾。 \ 反斜杠字符,用来转义。...// 加u修饰符以后,ES6就会识别\uD83D\uDC2A为一个字符,返回false。.../^\uD83D/u.test('\uD83D\uDC2A') // false /^\uD83D/.test('\uD83D\uDC2A') // true y修饰符 与g修饰符都是全局匹配,不同之处在于...、{n}、{n,}、{n,m} 限定符 任何元字符^、$、\ 定位点和序列 | 替换 关于引擎 JS 是 NFA 引擎。 NFA 引擎的特点: 以贪婪方式进行,尽可能匹配更多字符。
image.png 往数据库存一条记录: @Test public void testInsert() { User user = new User(); user.setUsername("\uD83D...其中username是\uD83D\uDE00 。 其实\uD83D\uDE00是一个emoji表情。
:45.709 BYFoundationLog_Demo[1657:53604] { "My bolg" = "http://qiubaiying.top"; Unicode = "\Ud83d...\Ude00\Ud83d\Ude01\Ud83e\Udd23\Ud83d\Ude02\Ud83d\Ude04"; contact = ( "BY Blog:http://
:)/); // [ "\ud83d", "\ude04", "\ud83d", "\ude04" ] "".split(/(?...; console.log(favShow); //['\uD83D', '\uDE04', '\uD83D', '\uDE04'] 结论 总而言之,以下是我们可以完成这项工作的方法。
「本章节复习的是JS中的正则表达式,JS中用来匹配字符串的强大工具。」 前置知识: JS中的正则表达式是用来匹配字符串中指定字符组合的模式。 另外需要记住:正则表达式也是对象。...2.使用正则表达式 JS的正则表达式可以被用于: RegExp对象的exec和test方法; String对象的match、replace、search和split方法。.../^\uD83D/u.test('\uD83D\uDC2A'); // false /^\uD83D/.test('\uD83D\uDC2A'); // true 由于ES5之前不支持四个字节UTF-
如下: /^\uD83D/u.test('\uD83D\uDC2A') // false /^\uD83D/.test('\uD83D\uDC2A') // true // 如上代码因为在ES5中 不支持四个字节的
写 JS 代码的同学们不知道有没有注意过,后台接口通过 JSON 处理汉字字符、emoji 时,返回的是像 \u00ff 这样转义处理的字符,而不是它们的明文原文。这是为什么呢? <?...php echo json_encode('再会,谢谢所有的'); // -> "\u518d\u4f1a\uff0c\u8c22\u8c22\u6240\u6709\u7684\ud83d\udc1f..." import json print(json.dumps('再会,谢谢所有的')) # -> "\u518d\u4f1a\uff0c\u8c22\u8c22\u6240\u6709\u7684\ud83d...编码方式 这里就涉及到文件编码与 JS 引擎内部编码的区别了,有兴趣的同学可以阅读一下相关文章: 《Unicode 编码及 UTF-32, UTF-16 和 UTF-8》 《JavaScript 的内部字符编码是...所以,这个模块在 JavaScript 的字符串进行 MD5 计算前,“尝试”将 JS 引擎内的 UTF-16/UCS-2 格式的字符串先转换成了基于 UTF-8 格式表示的 Unicode 字符,再将其对应编码值进行
领取专属 10元无门槛券
手把手带您无忧上云