Javascript,将一个字符串拆分为4段,其余部分作为一个大段
我正在为某个东西构建一个Javascript聊天机器人,但遇到了一个问题: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
我使用
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