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

原文:浅谈 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 也是支持中文空格的。
好了今天就分享这么个小知识点,明天见。

时间: 2024-08-03 04:45:43

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

浅谈 js 字符串 search 方法

原文:浅谈 js 字符串 search 方法 这是一个很久以前的事情了,好像是安心兄弟在学习js的时候做的练习.具体记不清了,今天就来简单分析下 search 究竟是什么用的. 从字面意思理解,一个是搜索字符串吧. var str = "123456789abcde"; console.log( str.search("abc") ); // 9 确实是搜索指定字符在一个字符串中出现的位置,如果不存在就返回 -1可是这样就跟 indexOf 功能一样了,何必单独搞一

浅谈js中test()函数在正则中的使用_javascript技巧

test() 方法用于检测一个字符串是否匹配某个模式. 返回一个 Boolean 值,它指出在被查找的字符串中是否匹配给出的正则表达式. regexp.test(str) 参数 regexp 必选项.包含正则表达式模式或可用标志的正则表达式对象. str    必选项.要在其上测试查找的字符串. 说明 test 方法检查字符串是否与给出的正则表达式模式相匹配,如果是则返回 true,否则就返回 false. 每个正则表达式都有一个 lastIndex 属性,用于记录上一次匹配结束的位置. var

浅谈js构造函数的方法与原型prototype_javascript技巧

把方法写在构造函数内的情况我们简称为函数内方法,把方法写在prototype属性上的情况我们简称为prototype上的方法. •函数内的方法: 使用函数内的方法我们可以访问到函数内部的私有变量,如果我们通过构造函数new出来的对象需要我们操作构造函数内部的私有变量的话, 我们这个时候就要考虑使用函数内的方法. •prototype上的方法: 当我们需要通过一个函数创建大量的对象,并且这些对象还都有许多的方法的时候;这时我们就要考虑在函数的prototype上添加这些方法. 这种情况下我们代码的

浅谈 js 正则之 test 方法

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

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

原文:浅谈 js 正则字面量 与 new RegExp 执行效率 前几天谈了正则匹配 js 字符串的问题:<js 正则学习小记之匹配字符串> 和 <js 正则学习小记之匹配字符串优化篇>.里面讲到了优化正则起到提升性能的问题,但是能提升多少呢?于是我去测试了,发现TMD几乎微乎其微,我用1千字符串进行100万次匹配测试,优不优化根本没区别. 这不科学,我白看了这么多天正则,上天这是在玩弄我么. 突然我想到了 compile 方法,然后去测试了下,奇迹出现了,果然优化过的快了不少.

浅谈js中StringBuffer类的实现方法及使用_javascript技巧

如下所示: <strong>JAVA中有一个StringBuffer类,js中却没有下面来自己实现一个简单的js的StringBuffer类.</strong> //创建一个StringBuffer类 ,此类有两个方法:一个是append方法一个是toString方法 function StringBuffer() { this.__strings__ = []; }; StringBuffer.prototype.append = function(str) { this.__s

浅谈python字符串方法的简单使用_python

学习python字符串方法的使用,对书中列举的每种方法都做一个试用,将结果记录,方便以后查询. (1) s.capitalize() ;功能:返回字符串的的副本,并将首字母大写.使用如下: >>> s = 'wwwwww' >>> scap = s.capitalize() >>> scap 'Wwwwww' (2)s.center(width,char); 功能:返回将s字符串放在中间的一个长度为width的字符串,默认其他部分用空格填充,否则使用c

浅谈js函数的多种定义方法与区别_javascript技巧

定义一个函数一般有如下三种方式: 1.函数关键字(function)语句: function fnMethodName(x){ alert(x); } 2.函数字面量(Function Literals): var fnMethodName = function(x){alert(x);} 3.Function()构造函数: var fnMethodName = new Function('x', 'alert(x);') 上面三种方法定义了同一个方法函数fnMethodName,第1种就是最常

浅谈js控制li标签排序问题 js调用php函数的方法_javascript技巧

[Html代码] <span style="font-size:14px;"><ul class="list-group"> <? if ($categorys): ?> <? foreach ($categorys as $category):?> <li class="list-group-item" data-id="<? echo $category->id ?&