5

我有这样的字符串

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. 我正在用一个' '字符重新加入字符串。真正的字符串参数可以由 a' '或 a分割\t,我想保持原件不变。

有任何想法吗?

4

6 回答 6

5

试试这个:

[ command, params ] = /^([^\s]+)\s(.*)$/.exec('FOO hello world').slice(1);
于 2012-12-16T20:09:59.017 回答
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);
}

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

于 2012-12-16T20:13:23.773 回答
2

@NathanWall 答案的变体,没有不必要的变量:

 [command, params] = /([^\s]+)\s(.+)/.exec('FOO hello world').slice(1)
于 2012-12-16T20:12:43.387 回答
0

这里有一个简单的代码:

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

第 1 部分将包含“FOO”和第 2 部分“hello world”

于 2012-12-16T20:18:41.103 回答
0

这是我的做法:

let raw = "FOO hello world"

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

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

我发现这比上面的切片更直观。

于 2021-07-29T15:33:18.183 回答
-2

另一种选择是:

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

我认为这看起来并不比您的原始代码更具语义。

于 2012-12-16T20:17:32.680 回答