Javascript,将一个字符串拆分为4段,其余部分作为一个大段

Javascript,将一个字符串拆分为4段,其余部分作为一个大段,javascript,arrays,tokenize,Javascript,Arrays,Tokenize,我正在为某个东西构建一个Javascript聊天机器人,但遇到了一个问题: 我使用string.split() tokens=message.split(“”) 现在我的问题是,我需要4个令牌来生成命令,1个令牌来生成消息。 当我这样做时: !finbot msg testuser 12345您好,先生,这是一条测试消息 这些是我得到的代币: [“!finbot”,“msg”,“testuser”,“12345”,“Hello”,“sir”,“this”,“is”,“a”,“test”,“mes

我正在为某个东西构建一个Javascript聊天机器人,但遇到了一个问题:
我使用
string.split()
tokens=message.split(“”)

现在我的问题是,我需要4个令牌来生成命令,1个令牌来生成消息。 当我这样做时:
!finbot msg testuser 12345您好,先生,这是一条测试消息

这些是我得到的代币:
[“!finbot”,“msg”,“testuser”,“12345”,“Hello”,“sir”,“this”,“is”,“a”,“test”,“message”]

但是,我怎样才能使它变成这样:
[“!finbot”,“msg”,“testuser”,“12345”,“您好,先生,这是一条测试消息”]

我之所以要这样做,是因为第一个令牌(
token[0]
)是呼叫,第二个令牌(
token[1]
)是命令,第三个令牌(
token[2]
)是用户,第四个令牌(
token[3]
)是密码(因为这是一个受密码保护的消息…只是为了好玩),第五个令牌(
token[4]
)是实际的消息。
现在,它只会发送
Hello
,因为我只使用第5个令牌。
我不能像
message=token[4]+token[5]那样去做的原因等是因为消息不总是正好是3个单词,或者不完全是4个单词等等

我希望我给了你足够的信息来帮助我。 如果你们知道答案(或者知道更好的方法),请告诉我


谢谢

使用以下参数的
限制

从那里,您只需要从字符串中获取消息。重复使用它的
nthIndex()
函数,可以获得第四次出现的空格字符的索引,并获取其后的任何内容

var message = message.substring(nthIndex(message, ' ', 4))
或者,如果您需要在
令牌
数组中使用它:

tokens[4] = message.substring(nthIndex(message, ' ', 4))

我可能会从像您一样获取字符串开始,并将其标记化:

const myInput = string.split(" "):
如果您使用的是JS ES6,您应该能够执行以下操作:

const [call, command, userName, password, ...messageTokens] = myInput;
const message = messageTokens.join(" ");
但是,如果您没有访问spread操作符的权限,您也可以这样做(只是要详细得多):

如果您再次需要它们作为数组,现在您可以将这些部分连接起来:

const output = [call, command, userName, password, message];

如果您可以使用es6,您可以执行以下操作:

let  [c1, c2, c3, c4, ...rest] = input.split (" ");
let msg = rest.join (" ");

如果您将格式定义为“4个不带空格的令牌,后跟空格和消息”,则可以恢复为regexp:

如果
msg
实际上与规范不匹配,这可能会导致返回空数组的不必要行为。请删除
。|124;[]
并进行相应处理,如果不可接受。令牌的数量也固定为4+所需消息。对于更通用的方法,您可以:

function tokenizer(msg, nTokens) {
    var token = /(\S+)\s*/g, tokens = [], match;

    while (nTokens && (match = token.exec(msg))) {
        tokens.push(match[1]);
        nTokens -= 1; // or nTokens--, whichever is your style
    }

    if (nTokens) {
        // exec() returned null, could not match enough tokens
        throw new Error('EOL when reading tokens');
    }

    tokens.push(msg.slice(token.lastIndex));
    return tokens;
}
这使用Javascript中regexp对象的特性重复测试同一个字符串,并使用属性在最后匹配的标记之后切片

给定

然后

请注意,即使给定的消息字符串仅包含令牌,也将始终向返回的数组追加空字符串:

> tokenizer('asdf', 1)
[ 'asdf', '' ]  // An empty "message" at the end

感谢您的回复,不幸的是,我现在得到的令牌是:
[“!finbot”,“msg”,“testuser”,“12345”]
我现在已经这样做了:使用了
令牌[4]=message.substring(第n个索引(message',,4))hoever,我得到一个错误:nthIndex不是defined@FinlayRoelofs-您需要使用我链接到的答案中定义的函数…Firefox 45.3.0是否支持ES6?具体来说,您需要支持解构。如果你想用babel进行传输,Firefox 45.3.0支持ES6吗?这是一个很好的问题,你可以自己用谷歌搜索谢谢,我会研究一下。从不知道ES6。。。一直认为Javascript只是。。。好。。。Javascript…不是最近!这种语言在不断发展,特别是最近几年。不断获得新功能!更多信息:非常有趣。。。我会调查的!(并试着理解它)还有一个问题,如果我想使用更少的代币怎么办?比如说总共3个代币。因此,1个命令将是5个令牌,另一个命令将是3。使用更通用的解决方案更新了答案。您好,很抱歉再次打扰您,但我已将我的bot重写为Node.JS并对其进行了一点更新,但是,它杀死了令牌发生器。。。现在,通过标记器运行后得到的数组是空的。唯一改变的是
!finbot
参数(它在代码前面被剥离)。所以数组现在只是
[“msg”,“testuser”,“12345”,“Hello”,“sir”,“this”,“is”,“a”,“test”,“message”]
我已经尝试了我想到的所有方法,但我自己无法修复它。听起来你好像在尝试将数组作为参数传递给函数。如果是真的,那么它显然无法正常工作。它是用来分裂弦的。另一方面,它不应该返回空数组,而是会失败。啊,是的,我明白了:)我现在将整个字符串传递给它,它就工作了!谢谢现在我可以使用facedesk了,原因还有:D
function tokenize(msg) {
    return (/^(\S+) (\S+) (\S+) (\S+) (.*)$/.exec(msg) || []).slice(1, 6);
}
function tokenizer(msg, nTokens) {
    var token = /(\S+)\s*/g, tokens = [], match;

    while (nTokens && (match = token.exec(msg))) {
        tokens.push(match[1]);
        nTokens -= 1; // or nTokens--, whichever is your style
    }

    if (nTokens) {
        // exec() returned null, could not match enough tokens
        throw new Error('EOL when reading tokens');
    }

    tokens.push(msg.slice(token.lastIndex));
    return tokens;
}
var msg = '!finbot msg testuser 12345 Hello sir, this is a test message';
> tokenizer(msg, 4)
[ '!finbot',
  'msg',
  'testuser',
  '12345',
  'Hello sir, this is a test message' ]
> tokenizer(msg, 3)
[ '!finbot',
  'msg',
  'testuser',
  '12345 Hello sir, this is a test message' ]
> tokenizer(msg, 2)
[ '!finbot',
  'msg',
  'testuser 12345 Hello sir, this is a test message' ]
> tokenizer('asdf', 1)
[ 'asdf', '' ]  // An empty "message" at the end