【问题标题】:Replace initial spaces with underscores in Javascript在Javascript中用下划线替换初始空格
【发布时间】:2018-08-10 19:29:09
【问题描述】:

用(比如)下划线替换空格很容易:

y = x.replace(/ /g, '_');

删除前导空格也很容易:

y = x.replace(/^ +/, '');

但是有没有一种好方法可以只用下划线替换初始空格?

【问题讨论】:

标签: javascript regex text replace replaceall


【解决方案1】:

T.J. Crowder's answer 肯定比这种方法好,但我想我会添加它,因为所有主流浏览器都支持后向搜索只是时间问题。在撰写此答案时,Chrome 62 和 XS(2018 年 1 月 17 日更新)中提供的 V8 引擎是 JavaScript 中可变长度后视的唯一实现,根据 EMCA TC39's regexp lookbehind proposal。

注意下面的正则表达式包含一个尾随空格。如果你有 Chrome 62+(或者如果你在未来;另一个支持可变长度后视的浏览器)你可以test the regex here。

(?<=^ *) 

const regex = /(?<=^ *) /g
const str = '        something is here'

console.log(str.replace(regex, '_'))

【讨论】:

  • “T.J. Crowder 的回答肯定比这种方法好……” 我不敢苟同。 :-) 非常酷。 由于后视是第 4 阶段,这意味着它们至少处于两个实现中(可能是 V8 和 SpiderMonkey)并且它们将在 ES2018 快照规范中。
  • @T.J.Crowder 这很酷,但不适用于所有浏览器。编写生产代码我仍然会使用你的方法:)
【解决方案2】:

我想用下划线替换每个前导空格

要做到这一点,只需在当前规范中调用一个 replace,* 你需要 replace 的函数调用版本来做到这一点,只要匹配的空格序列创建一个下划线字符串:

y = x.replace(/^ +/, function(m) {
    return "_".repeat(m.length);
});

或使用 ES2015+ 箭头函数:

y = x.replace(/^ +/, m => "_".repeat(m.length));

现场示例:

const x = "    four spaces";
const y = x.replace(/^ +/, m => "_".repeat(m.length));
console.log(y);

String.prototype.repeat 在 ES2015 中添加。如果你需要支持过时的 JavaScript 引擎,the MDN page 有一个你可以使用的 polyfill。


* 但是see ctwheels' answer 使用了 ES2018 中的一个特性:Look-behinds。五、聪明!

【讨论】:

  • 好吧,我还没有真正使用过胖箭头。
【解决方案3】:

将两个正则表达式组合在一起并没有错:

var x = '     hello world';
var y = x.replace(/^ +/, u => u.replace(/ /g,  "_"));
console.log(y); // Outputs: ____hello world

上面的一个长手版本是:

var y = x.replace(/^ +/, function (u) { return u.replace(/ /g, "_"));

本质上,外部正则表达式/替换获取初始空格,内部正则表达式/替换仅用下划线替换那些空格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-12
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    相关资源
    最近更新 更多