原文:浅谈 js 字符串 trim 方法之正则篇

关于 trim 其实没啥好说的,无非就是去除首位空格,对于现代浏览器来说只是简单的正则 /^\s+|\s+$/ 就可以搞定了。
而且支持中文空格   等等。
什么 \s 支持 中文空格?
是的。

打开 RegExp#character-classes 往下拉一点,找到 \s 这个解释。

原文:
Matches a single white space character, including space, tab, form feed, line feed and other Unicode spaces. Equivalent to [ \f\n\r\t\v\u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000].

谷歌译文:
匹配单个空白字符,包括空格,制表符,换页,换行等Unicode的空格。
相当于 [ \f\n\r\t\v\u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]

其中 \u00a0 是   \u3000 是 中文空格,其他是什么,我也不知道,有兴趣的可以自己去翻 unicode 表。

看到这,已经颠覆了我们传统正则的规范了,以前,我们只知道 \s 等价于 [ \f\n\r\t\v],但却不知道现在的js里却等价于所有空白字符。
话虽如此,但是低版本却一直是 [ \f\n\r\t\v],甚至连 trim 都木有,所以我们要兼容低版本的话,不能简单的用 /^\s+|\s+$/ 处理了,要加上中文空格 和  
所以要 /^[\s\u3000\u00A0]+|[\s\u3000\u00A0]+$/ 才行,这样常用的就有了,至于那些 \u2000 之类的,我也不知道是什么,可以按需添加进去。
常用的无非就中文空格和实体空格了。

我们看下 jQuery 是怎么处理这个的。

// 1.4.1
rtrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g, // 1.5.1, 1.6.1, 1.7.1
trimLeft = /^[\s\xA0]+/;
trimRight = /[\s\xA0]+$/; // 1.8.1, 1.9.1, 1.10.1, 1.11.1
rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,

好吧,1.4-1.7 都一样,值去除普通空格和实体空格。
1.8-1.11 加了一个 \uFEFF ,这个是什么东西呢?
jQuery 的注释写到 Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
译为: 确保去除 BOM 和   (请看你的 Safari 5.0 and IE)
什么 BOM ?为什么会出现 BOM ?
这东西一般人是打不出来的,为什么要去除这个呢?
PS:这里的BOM是 字节顺序标记(byte-order mark),不清楚的,请翻阅这里 字节顺序标记

我也不知道,最近翻不了墙,所以懒得找了。
但是他不去除中文空格这有点说不过去了,难道他们不会中文,就无视中文空格么?
所以我们应该优化下这个正则 /^[\s\u3000\uFEFF\xA0]+|[\s\u3000\uFEFF\xA0]+$/g 这样才对嘛。

来看下原生 trim 和我们正则去除结果如何吧:

var rtrim = /^[\s\u3000\uFEFF\xA0]+|[\s\u3000\uFEFF\xA0]+$/g;
console.log( "普通空格测试:" );
console.log( "'" + " 普通空格 ".replace(rtrim, "") + "'" );
console.log( "'" + " 普通空格 ".trim() + "'" ); console.log( "实体空格测试:" );
console.log( "'" + " \u00a0 实体空格 \u00a0 ".replace(rtrim, "") + "'" );
console.log( "'" + " \u00a0 实体空格 \u00a0 ".trim() + "'" ); console.log( "中文空格测试:" );
console.log( "'" + "   中文空格   \u3000".replace(rtrim, "") + "'" );
console.log( "'" + "   中文空格   \u3000".trim() + "'" );

结果很明显,都去除干净了,说明 trim 也是支持中文空格的。
好了今天就分享这么个小知识点,明天见。

浅谈 js 字符串 trim 方法之正则篇的更多相关文章

  1. 浅谈 js字符串 trim 方法之正则篇

    关于 trim 其实没啥好说的,无非就是去除首位空格,对于现代浏览器来说只是简单的正则 /^\s+|\s+$/ 就可以搞定了.而且支持中文空格   等等.什么 \s 支持 中文空格?是的. 打开 Re ...

  2. 浅谈 js 字符串 search 方法

    原文:浅谈 js 字符串 search 方法 这是一个很久以前的事情了,好像是安心兄弟在学习js的时候做的练习.具体记不清了,今天就来简单分析下 search 究竟是什么用的. 从字面意思理解,一个是 ...

  3. 浅谈 js 字符串之神奇的转义

    原文:浅谈 js 字符串之神奇的转义 字符串在js里是非常常用的,但是你真的了解它么?翻阅<MDN String>就可以了解它的常见用法了,开门见山的就让你了解了字符串是怎么回事. 'st ...

  4. 浅谈 js 对象 toJSON 方法

    前些天在<浅谈 JSON.stringify 方法>说了他的正确使用姿势,今天来说下 toJSON 方法吧.其实我觉得这货跟 toString 一个道理,他是给 stringify 方法字 ...

  5. 浅谈js的join()方法

    简单描述:今天看同事的代码,看js的时候,看到了一个join()方法,我从来都没有用过,就查了查,第一次用就记录一下 正经的: 定义和用法 join() 方法用于把数组中的所有元素放入一个字符串. 元 ...

  6. 浅谈js数据类型识别方法

    js有6种基本数据类型  Undefined , Null , Boolean , Number , String ,Symbol和一种引用类型Object,下面我们就来一一看穿,哦不,识别他们. t ...

  7. 浅谈js的sort()方法

    如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码(字符串Unicode码点)的顺序进行排序.要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以 ...

  8. 浅谈 js 正则之 test 方法

    原文:浅谈 js 正则之 test 方法 其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西.先来看个东西吧. var re = /\d/; console. ...

  9. 浅谈 js 正则字面量 与 new RegExp 执行效率

    原文:浅谈 js 正则字面量 与 new RegExp 执行效率 前几天谈了正则匹配 js 字符串的问题:<js 正则学习小记之匹配字符串> 和 <js 正则学习小记之匹配字符串优化 ...

随机推荐

  1. Web指纹识别目的Discuz识别+粗糙的版本演绎

    这个识别程序是本学期在我的职业培训项目.它是做一类似至Zoomeye怪东西,然后使用ES集成,为了让搜索引擎寻找.因此,我们必须首先去网上识别相应的能力Web包裹,如果用户输入的关键词:Discuz ...

  2. 站点系统压力測试Jmeter+Badboy

    近期项目须要压力測试,因此搜了几款试用,首选的是LoadRunner这款大名鼎鼎的測试软件: LoadRunner11 下载请猛戳这里 传送门LoadRunner破解文件 下载请猛戳这里 传送门Loa ...

  3. IOS使用Jenkins持续集成

    本文详细介绍了开发过程,提高效率进行IOS-Jenkins持续集成. 第二http://blog.csdn.net/monkey_cool/article/details/43270885 背景 平时 ...

  4. 【java基础】==与equals()方法比较

    1.八种基本类型 只有"=="方法进行判断是否相等,比较的是基本数据类型的值,没有equals()方法 2.Java类库中的类 "=="比较的是对象的句柄,即内 ...

  5. Socket方法LAN多线程文件传输

    1.思维:为了实现各种文件的大小可以被发送和接收的,它可以被设置为发送和接收缓冲器环.并记录文件的位置读取,假设读入缓冲区的字节的特定数目大于缓冲区的大小较小.然后该文件被发送,退出发送周期,关闭连接 ...

  6. BZOJ 2588 Count on a tree (COT) 是持久的段树

    标题效果:两棵树之间的首次查询k大点的权利. 思维:树木覆盖树,事实上,它是正常的树木覆盖了持久段树. 由于使用权值段树可以寻求区间k大,然后应用到持久段树思想,间隔可以做减法.详见代码. CODE: ...

  7. SQLHlper意识

    经过学习,通过线敲登录的三个例子,敲四行CRUD样品,因此,访问数据库多次,在这些链接库.打开都一样.只是不同的操作将针对不同的表进行.始学习面向对象的思想.当让要对这些不变的要内容要进行打包,提高代 ...

  8. Linux网络编程一站式学习

    提要 学过非常多遍计算机网络,依旧不会网络编程. 看完这篇文章之后就不会是这样了. 环境:Ubuntu14.04 64bit 何为Socket 是基于TCP/IP的网络应用编程中使用的有关数据通信的概 ...

  9. 左右TS分析流

    字节.在TS流里能够填入非常多类型的数据.如视频.音频.自己定义信息等.他的包的结构为,包头为4个字节,负载为184个字节(这184个字节不一定都是有效数据.有一些可能为填充数据). 工作形式: 由于 ...

  10. Java Web项目结构

    Java Web项目结构(一般) 1.Java src 2.JRE System Library 3.Java EE 6 Libraries 4.Web App Libraries 5.WebRoot ...