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

IT技术 javascript regex
2021-02-20 23:33:55

我试图找到一种方法来修剪标题字符串开头和结尾的空格。我正在使用它,但它似乎不起作用:

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

有任何想法吗?

6个回答

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


Steven Levithantrim在性能方面分析了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;
}

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

参考

我怀疑在最近对 javascript 性能进行改进之后,该测试是否仍然与此答案时一样相关或可靠。
2021-04-15 23:33:55
你为什么使用双白字符?又名为什么这个正则表达式/^\s\s*/而不是这个/^\s*/
2021-04-18 23:33:55
新的 Safari (5)、Chrome(5)、Firefox(3.6) 和 Opera (10.5) 都支持原生 String 修剪方法。既然如此,我会为 String.prototype 分配一个方法,如果它不存在,而不是一个新的全局函数。
2021-04-26 23:33:55
String.prototype.trim = String.prototype.trim || function trim() { return this.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); };
2021-05-04 23:33:55
为什么trim1trim11
2021-05-14 23:33:55

如果使用 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);

正如@ChaosPandion提到的,该String.prototype.trim方法已经被引入到ECMAScript 5th Edition Specification 中,一些实现已经包含这个方法,所以最好的方法是检测本机实现并只有在它不可用时才声明它

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

然后你可以简单地:

title = title.trim();
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." }
2021-04-27 23:33:55
@kojiro,好吧,也许抛出错误会很好,但我是这样看的:我正在尝试制作符合规范的 shim,如果String.prototype.trim不是函数,则它不是String.prototype.trimECMAScript 第 5 版中描述方法规范,规范保证trim在 ES5 环境是一个函数对象。
2021-05-04 23:33:55
我总是对这种检查属性是否为函数的模因感到困惑。如果它不是一个函数,那么真正覆盖它的行为是正确的吗?也许你应该在这种情况下抛出一个错误。
2021-05-09 23:33:55

我知道这是一个旧帖子,但只是想我会分享我们的解决方案。为了寻求最短的代码(不是每个人都喜欢简洁的正则表达式),可以改为使用:

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

顺便说一句:我通过blog.stevenlevithan.com上面共享的链接进行了同样的测试——更快的 JavaScript Trim和这种模式击败了所有其他人!

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

原始长度:226002
trim1:110ms(长度:225994)
trim2:79ms(长度:225994)
trim3:172ms(长度:225994)
trim4:203ms(长度:225994)
trim5:172ms(长度:9412)
trim2:172ms(长度:225994)trim3:203ms(长度:225994)225994)
trim7:203ms(长度:225994)
trim8:47ms(长度:225994)
trim9:453ms(长度:225994)
trim10:15ms(长度:225994)
trim11:16ms(长度:43255)
trim22
修剪 13:0 毫秒(长度:226002)

ECMAScript 5 支持trim并且这已在 Firefox 中实现。

修剪 - MDC