修剪字符串开头和结尾的空格


152

我试图找到一种方法来从标题字符串的开始和结尾修剪空格。我正在使用此功能,但似乎无法正常工作:

title = title.replace(/(^[\s]+|[\s]+$)/g, '');

有任何想法吗?


1
var s ='1'; s = s.replace(/ ^ \ s + | \ s + $ / g,''); alert('-'+ s +'-'); //它的工作原理是这样,您不需要括号或方括号。
ekerner

2
.trim现在已经内置了Javascript ,因此这是现代浏览器的答案:stackoverflow.com/a/3000900/29182
Ziggy 2014年


function trim11 (str) { str = str.replace(/^\s+/, ''); for (var i = str.length - 1; i >= 0; i--) { if (/\S/.test(str.charAt(i))) { str = str.substring(0, i + 1); break; } } return str; }
Badri Gs

Answers:


216

注意:从2015年开始,所有主流浏览器(包括IE> = 9)都支持String.prototype.trim()。这意味着对于大多数用例来说,简单地做str.trim()是实现问题所要求的最好方法。


Steven Levithan trim从性能方面分析了Javascript中的许多不同实现。

他的建议是:

function trim1 (str) {
    return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}

用于“快速跨浏览器的通用实现”,以及

function trim11 (str) {
    str = str.replace(/^\s+/, '');
    for (var i = str.length - 1; i >= 0; i--) {
        if (/\S/.test(str.charAt(i))) {
            str = str.substring(0, i + 1);
            break;
        }
    }
    return str;
}

“如果您想在所有浏览器中以极快的速度处理长字符串,”。

参考文献


21
新的Safari(5),Chrome(5),Firefox(3.6)和Opera(10.5)均支持本机String修剪方法。既然如此,我将为String.prototype分配一个方法(如果不存在),而不是一个新的全局函数。
肯纳贝克

14
String.prototype.trim = String.prototype.trim || function trim() { return this.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); };
kojiro 2011年

3
我怀疑在对javascript性能进行了最近的改进之后,此测试是否仍然是相关的或可靠的,就像在回答此问题时一样。
爱德华多

2
为什么使用双白色字符?aka为什么使用此正则表达式/^\s\s*/而不是此正则表达式/^\s*/
2014年

为什么trim1trim11
马蒂·科尔特斯

68

如果使用jQuery是一种选择:

/**
 * Trim the site input[type=text] fields globally by removing any whitespace from the
 * beginning and end of a string on input .blur()
 */
$('input[type=text]').blur(function(){
    $(this).val($.trim($(this).val()));
});

或者简单地:

$.trim(string);

48

@ChaosPandion所述,该String.prototype.trim方法已被引入ECMAScript 5th Edition规范,某些实现已包含此方法,因此最好的方法是检测本机实现并在不可用时声明它:

if (typeof String.prototype.trim != 'function') { // detect native implementation
  String.prototype.trim = function () {
    return this.replace(/^\s+/, '').replace(/\s+$/, '');
  };
}

然后,您可以简单地:

title = title.trim();

1
这种检查属性是否为函数的模因总是让我感到困惑。如果不是函数,那么正确的行为真的会覆盖它吗?在这种情况下,也许您应该抛出一个错误。
kojiro 2011年

1
@kojiro,好吧,也许抛出一个错误会很好,但是我这样看:我正在尝试制作符合规范的shim,如果String.prototype.trim不是函数,则不是String.prototype.trim ECMAScript 5th Edition上描述的方法规范,规范保证trim是ES5环境上的一个功能对象。
CMS

7
throw { name: "UnlikelyPolyfillException", message: "Did someone really write a property on the String prototype named 'trim' that isn't a ECMA 5 compatible shim? Come on now, that's crazy." }
2011年

34

我知道这是一篇旧文章,但只是想分享一下我们的解决方案。在寻求最短的代码(不是每个人都喜欢简洁的正则表达式)时,可以改用:

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

顺便说一句:我通过blog.stevenlevithan.com上共享的链接进行了相同的测试-Faster JavaScript Trim,该模式击败了所有其他HANDS!

使用IE8,将测试添加为test13。结果是:

原始长度:226002
trim1:110ms(长度:225994)
trim2:79ms(长度:225994)
trim3:172ms(长度:225994)
trim4:203ms(长度:225994)
trim5:172ms(长度:225994)
trim6:312ms(长度: 225994)
trim7:203ms(长度:225994)
trim8:47ms(长度:225994)
trim9:453ms(长度:225994)
trim10:15ms(长度:225994)
trim11:16ms(长度:225994)
trim12:31ms(长度:225994)
trim13:0ms(长度:226002)



11

在这里,这应该可以满足您的所有需求

function doSomething(input) {
    return input
              .replace(/^\s\s*/, '')     // Remove Preceding white space
              .replace(/\s\s*$/, '')     // Remove Trailing white space
              .replace(/([\s]+)/g, '-'); // Replace remaining white space with dashes
}

alert(doSomething("  something with  some       whitespace   "));

\ s \ s *似乎是多余的,因为存在\ s +,但速度更快
CaffGeek 2010年

4

这是我过去用来修剪js中字符串的一些方法:

String.prototype.ltrim = function( chars ) {
    chars = chars || "\\s*";
    return this.replace( new RegExp("^[" + chars + "]+", "g"), "" );
}

String.prototype.rtrim = function( chars ) {
    chars = chars || "\\s*";
    return this.replace( new RegExp("[" + chars + "]+$", "g"), "" );
}
String.prototype.trim = function( chars ) {
    return this.rtrim(chars).ltrim(chars);
}

RegExp 在字符串的开头^[\s*]+匹配*,因此您的函数将修剪"*** Foo""Foo"
Ferdinand Beyer

可能:)想知道为什么没有人抱怨过……很久以前,我编写了该代码,并在en.wikipedia.org/wiki/Wikipedia:Twinkle中使用了它。现在您已经指出了它是显而易见的。
2010年

4

这是我当前的代码,如果我注释了第三行,那么第二行可以工作,但是如果我保留它的原样,那么第二行就不能工作。

var page_title = $(this).val().replace(/[^a-zA-Z0-9\s]/g, '');
page_title = page_title.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
page_title = page_title.replace(/([\s]+)/g, '-');

删除第二行和第三行,并使用多基因润滑剂中的代码,page_title = trim1(page_title);
蚂蚁

所以最终您要尝试清理此字符串以使其被修剪,字母数字和破折号而不是空格作为分隔符?
CaffGeek 2010年

@乍得是的。快速创建从属URL,以便用户可以看到其URL外观。与创建新博客帖子时wordpress的操作类似。
James Jeffery 2010年


2

jQuery.trim(“你好,你好吗?”);

:)


2
看起来您可能在笑,但请记住,阅读此评论的人可能会倾向于使用您的解决方案并继续前进。
commadelimited

$ .trim(“ bblah blah blah”); 正确返回“ blah blah blah”
RAY

2

完全加载DOM后,可以将其添加到所有文本字段中。我从来没有遇到需要提交前导或尾随空格的情况,因此在全球范围内一直这样做对我很有用...

$(function() { $('input[type=text]').on('blur', function(){
    $(this).val($.trim($(this).val()));
  });
});

需要jQuery。另一个问题(我没有测试过):blur当我在某个字段中并按<kbd> enter </ kbd>发送表格时,实际上是否在提交之前发生?
amenthes

2

这就是JavaScript架构师/ Guru Douglas Crockford的建议。

String.method('trim', function (  ) {
    return this.replace(/^\s+|\s+$/g, '');
});

注意:您必须为Function.prototype定义“方法”。

或者

String.prototype.trim = function () {
   return this.replace(/^\s+|\s+$/g, '');
};

title.trim();    // returns trimmed title

观察

在最近的浏览器中,默认情况下包括trim方法。因此,您不必显式添加它。

主要浏览器Chrome,Firefox,Safari等支持修剪方法。已在Chrome 55.0.2883.95(64位),Firefox 51.0.1(64位),Safari 10.0(12602.1.50.0.10)中检查。


1
var word = " testWord ";   //add here word or space and test

var x = $.trim(word);

if(x.length > 0)
    alert('word');
else
    alert('spaces');

0

为此的递归尝试

function t(k){ 
    if (k[0]==' ') {
        return t(k.substr(1,k.length));
    } else if (k[k.length-1]==' ') {
        return t(k.substr(0,k.length-1));
    } else {
        return k;
    }
}

像这样打电话:

t("      mehmet       "); //=>"mehmet"

如果要过滤特殊字符,则可以基本上定义一个列表字符串:

function t(k){
    var l="\r\n\t "; //you can add more chars here.
    if (l.indexOf(k[0])>-1) {
        return t(k.substr(1,k.length));
    } else if (l.indexOf(k[k.length-1])>-1) {
        return t(k.substr(0,k.length-1));
    } else {
        return k;
    }
}

与要求的内容有细微的差别!您正在检查一个空格' ',但问题通常是关于空格,包括"\n""\t"以及其他在regex中由匹配的不可打印字符/\s/
amenthes's

那么您可以将if condition修改为“ if(” \ t \ r \ n“ .indexOf(k [0])>-1)”仍然有效,这些已经是某些类型了。
mguven guven
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.