如何从字符串中删除空格?

44

JavaScript似乎没有本地的trim()方法。使用JavaScript如何修剪字符串开头和结尾的空格?

19个回答

42

jQuery的最短形式:

string = $.trim(string);

链接


32

根据这个页面,最好的综合方法是

return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');

当然,如果你使用jQuery,它将为你提供一个优化的去除空格方法。


根据所链接的页面,\s+ 和 \s\s* 之间唯一的区别仅在于后者稍微快一些。 - Pat
1
如果您继续阅读,文章结尾提到的修改过的trim11是更适合长字符串的更好方法。 - Chris MacDonald
2
这是一个旧的线程,与此同时,本地 trim 已经在 Javascript 中实现。Pat 的正则表达式以及 Chris MacDonald 提到的 trim11 非常慢,而且 jquery 的 trim 在某些浏览器中也很慢(http://jsperf.com/mega-trim-test/16)。更快的 trim 实现在这里:https://dev59.com/ZHVC5IYBdhLWcg3wvT7g#12547889。 - Timo Kähkönen

27

2
你说得对!本地化始终更好。它仅适用于IE9及以上版本,但在未来几年中这也不会太重要。 - MDCore
@MDCore感谢您接受我的答案并提到最低IE版本。但是,当您说它在未来几年内不重要时,您指的是什么?您是否在说JavaScript将变得过时? - K. R.
2
@KR 所以我五年半前问了这个问题。从那时起,trim()已成为标准函数。我考虑仅指出我们在IE支持方面几乎到达那里,但在另外五年半之后,这将是无关紧要的。如果他们被困在IE8上,我宁愿人们使用本地功能并使用其他许多答案之一。 - MDCore

18

很多人常常说,trim函数非常好用,但如果您不想使用整个框架来执行trim操作,那么查看它的实现可能很有用。因此在这里呈现其实现:

function( text ) { return (text || "").replace( /^(\s|\u00A0)+|(\s|\u00A0)+$/g, "" );}

与其他已经在此处提出的解决方案相比,我认为此实现的主要优点包括:

  • 'g'标志允许您在多行字符串上执行修剪操作
  • (text || "") 语法可以确保即使传递的参数为null或undefined,该函数也始终有效。

没有 m 标志,g 标志在这里没有用处。 - Alin Purcaru

8

正如其他人已经指出的那样,最好使用第三方JS库来完成这种操作。不是说trim()函数很难自己构建,而是有许多JavaScript本身没有的函数,你可能需要编写自己的函数,很快就会变得不划算,因此使用库更具成本效益。

当然,使用JS库的另一个优点是作者会辛勤劳作,确保函数在所有主要浏览器上都能正常工作,这样你就可以编写标准接口的代码,并忘记Internet Explorer和其他浏览器之间的烦人差异。


7
@Pat的版本稍微小了一点。
return str.replace( /^\s+|\s+$/g, '' );

我认为你需要在方法调用中对文本进行执行。 ;) - J c

6

对于 ltrim,将字符串开头的空格替换为空:

str2 = str.replace(/^\s+/,'');

对于rtrim,将字符串末尾锚定的空格替换为空:
str2 = str.replace(/\s+$/,'');

关于修剪:

str2 = str.replace(/^\s+|\s+$/g,'');

所有这些都使用正则表达式来完成实际工作。


5

使用Ariel Flesler的快速修剪函数

// Licensed under BSD
function myBestTrim( str ){
 var start = -1,
  end = str.length;
 while( str.charCodeAt(--end) < 33 );
 while( str.charCodeAt(++start) < 33 );
 return str.slice( start, end + 1 );
};

我的解决方案是这样的(因为Firefox 3.5及以上版本中的String对象已经有了一个trim方法):

String.prototype.trim = String.prototype.trim || function () {
    var start = -1,
        end   = this.length;

    while( this.charCodeAt(--end) < 33 );
    while( this.charCodeAt(++start) < 33 );

    return this.slice( start, end + 1 );
};

你在开玩笑吗?它不可能快,因为它使用了大量的函数。 - Jasper

5
为什么不直接修改字符串原型?为什么不像我在这里使用YUI那样从开源库中窃取修剪函数呢?(对于这个简单的任务,您真的需要加载整个框架吗?)将它们组合在一起,您就可以得到这个:
String.prototype.trim = function() {
    try {
        return this.replace(/^\s+|\s+$/g, "");
    } catch(e) {
        return this;
    }
}

var s = " hello ";
alert(s.trim() == "hello"); // displays true

4

我设计了一个高效的字符串修剪函数。这个函数在与其他24个竞争者(其中许多使用正则表达式)和Chrome和Chromium的本地string.trim()相比,有明显的优势,并且与Safari的trim()一样快速。测试结果在此处:http://jsperf.com/mega-trim-test/7

function trim27(str) {
  var c;
  for (var i = 0; i < str.length; i++) {
    c = str.charCodeAt(i);
    if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12)
    continue; else break;
  }
  for (var j = str.length - 1; j >= i; j--) {
    c = str.charCodeAt(j);
    if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12)
    continue; else break;
  }
  return str.substring(i, j + 1);
}

该函数去除字符 " \n\r\t\f",但很容易添加更多空格字符,例如正则表达式中用作空格符的字符(\s),性能只会略微下降(请参见 http://jsperf.com/mega-trim-test/8
编辑:之前的 trim27() 只去除最常见的字符(" \n\r\t\f"),但为了去除所有可能的空格符,我添加了一个新函数 mytrim():
if (!String.prototype.trim || "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF".trim() || navigator.userAgent.toString().toLowerCase().indexOf("chrome") != -1)
    var mytrim = function(str) {
        var c;
        for (var i = 0; i < str.length; i++) {
            c = str.charCodeAt(i);
            if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12 || c == 11 || c == 160 || c == 5760 || c == 6158 || c == 8192 || c == 8193 || c == 8194 || c == 8195 || c == 8196 || c == 8197 || c == 8198 || c == 8199 || c == 8200 || c == 8201 || c == 8202 || c == 8232 || c == 8233 || c == 8239 || c == 8287 || c == 12288 || c == 65279)
            continue; else break;
        }
        for (var j = str.length - 1; j >= i; j--) {
            c = str.charCodeAt(j);
            if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12 || c == 11 || c == 160 || c == 5760 || c == 6158 || c == 8192 || c == 8193 || c == 8194 || c == 8195 || c == 8196 || c == 8197 || c == 8198 || c == 8199 || c == 8200 || c == 8201 || c == 8202 || c == 8232 || c == 8233 || c == 8239 || c == 8287 || c == 12288 || c == 65279)
            continue; else break;
        }
        return str.substring(i, j + 1);
    };
    else var mytrim = function(str) {
        return str.trim();
    }

使用方法如下:

var foo = mytrim(" \n \t Trimmed \f \n "); // foo is now "Trimmed"

上面的mytrim()函数执行以下操作:

  • 修剪26种不同的空白字符(所有25个空白字符在http://perfectionkills.com/whitespace-deviations/中提到,另外还包括零宽度不间断空格uFEFF)。
  • 使修剪结果在各种浏览器中保持一致。
  • 如果可用并且能够修剪27种不同的空白字符,则使用本地trim()。例外情况是Chrome和Chromium的本地trim()非常慢,我们使用自定义trim()代替。
  • 而且最重要的是:虽然不美观也不简短,但比http://jsperf.com/mega-trim-test/12中的其他24个竞争对手都要快得多(例外情况:在Windows 7中,相当老的Firefox 3.6.25以未知原因运行mytrim()速度较慢)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接