如何将JavaScript字符串拆分为最多两个部分?

6
我有这样的字符串
FOO hello world
BAR something else
BISCUIT is tasty
CAKE is tasty too

目标是在第一个单词后拆分字符串。到目前为止,我正在使用以下方法:

# coffeescript
raw = 'FOO hello world'
parts = raw.split /\s/
[command, params] = [parts.shift(), parts.join(' ')]
command #=> FOO
params #=> hello world

我不喜欢这个方法有两个原因:

  1. 看起来效率不高。
  2. 我使用了 ' ' 字符重新连接字符串。真实的字符串参数可以由 ' '\t 分隔,而我想保留原始的字符串。

你有什么建议吗?

6个回答

5

试一试这个:

[ command, params ] = /^([^\s]+)\s(.*)$/.exec('FOO hello world').slice(1);

我将标记此答案为已接受,但请根据@ualinker的建议使用.slice(1)来处理丢弃的变量。 - Mulan

5
您可以使用 indexOf 来查找空格(对于 \t - 单独处理并选择两个索引中较小的那个),然后在那里使用slice
var command;
var params = '';
var space = raw.indexOf(" ");
if(space == -1) {
    command = e.data;
} else {
    command = raw.slice(0, space);
    params = raw.slice(space + 1);
}

此外,它更快,因为它不使用正则表达式。

2

@NathanWall的回答变种,没有不必要的变量:

 [command, params] = /([^\s]+)\s(.+)/.exec('FOO hello world').slice(1)

哦,原来是这样。谢谢。 - ualinker

0

这是我会怎么做:

let raw = "FOO hello world"

raw.split(" ")
    .filter((part, index) => index !== 0)
    .join(" ")

基本上,取出单词,按空格(或其他)将其分割,然后过滤掉第一个单词,最后将其重新连接起来。

我认为这比上面的切片更直观。


0

这里是一个简单的代码:

var t = "FOO hello world";
var part1 = t.match(/(\w+\s)/)[0];
var part2 = t.replace(part1,"");

part1将包含"FOO ",part2将包含"hello world"


这非常危险。如果单词 FOO 在参数的任何其他位置出现,它也将被删除。 - Mulan
不,使用“FOO hello FOO world”它将返回“FOO”和“hello FOO world”,它不会替换所有的FOO,而只是第一个。 - solisoft
我刚在Chrome的控制台中测试了一下。Solisoft是正确的:"abac".replace("a", "*")会得到"*bac"(我绝对确定它会得到"*b*c"!)。你必须使用带有替换所有匹配项的正则表达式来进行替换。 - Roimer

-2

另一个选项是:

# coffeescript
raw = 'FOO hello world'
[command, params] = raw.split(/\s/, 2)
command #=> FOO
params #=> hello world

我认为这看起来比你的原始代码更具有语义性。


2
谢谢你在这里提供帮助。我也看到.split()接受两个参数。不幸的是,在你上面的例子中,它只会返回[FOO, hello]world被切掉了:( - Mulan

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