【问题标题】:Numbers from inside a string without regex?没有正则表达式的字符串中的数字?
【发布时间】:2019-05-31 07:45:01
【问题描述】:

我正在和一些朋友一起为游戏聊天室制作机器人,但我陷入了僵局。有没有一种可靠的方法可以从不会完全破坏没有经验的脚本小子大脑的文本字符串中获取数字?这是迄今为止我能想到的最好的,为了便于说明,变量稍微简化了:

var k = [0];
function dieRoll(m,n) {
    for(i = 0; i < m; i++) {
        k[i] = Math.floor(Math.random()*n)+1;
    }
}

var m = text[5];
var n = text[7];
if (text === 'roll '+m+'d'+n) {
    dieRoll(m,n)
    console.log(k);
}

最大的问题是它仅限于单个数字输入。

编辑:在文本中循环查找整数正是我正在寻找的那种东西。我没有太多的编程经验,所以我可能最终会得到过于复杂和混乱的意大利面条代码,这会让任何远程专业人士感到尴尬。至于我正在寻找的输入格式,“掷[骰子数]d [骰子上的最高数字]”。对于任何不知道的人,这是大多数桌面 rpg 使用的符号。例如,两个普通的六面骰子“掷 2d6”。

编辑:这并不是说我一定要反对正则表达式,我只是想能够理解发生了什么,这样当我需要编辑或重用代码时,我可以这样做而不会完全发疯。

编辑:非常感谢大家! split() 似乎正是我想要的!这可能需要一些尝试和错误,但我想我可以让她在这个周末按照她应该的方式工作(是的,我称我的机器人为“她”)。

【问题讨论】:

  • 字符串输入会是什么样子?以这种方式举个例子更容易,但只是为了提供一种方式,您始终可以遍历字符串字符,如果值为 isNaN 则忽略它,否则它是一个数字。
  • @basic 来自底部的=== 比较,它看起来应该遵循模式“roll \d+d\d+”
  • 对于完全不使用正则表达式的解决方案,您有多么特别? @thenotoriouswhitemoth
  • 我建议对文本使用 .split("") 函数,例如 var splitText = text.split("");这会将字符串分解为单独的字符作为数组。然后,您可以遍历数组以查找数字。尽管如此,我还是强烈建议您查看一个数字正则表达式,因为它可以更好地扩展。
  • 我只是将正则表达式解决方案放在 cmets 中,因为从技术上讲,它不是您问题的答案,但我只是想证明明智地使用缩放是多么容易。这段代码将注销字符串中找到的所有数字匹配,无论数字中有多少位: var text = "example 25 thing392more86"; var splitText = text.match(/\d+/g); splitText.forEach(function(value){ console.log(value); });

标签: javascript string input integer chatbot


【解决方案1】:

基本上,您需要查看正在使用的输入格式,并确定有关它的某些事实。以下是我根据您的问题做出的假设。

1) "roll" 命令首先出现,后跟一个空格,并且 2) 在命令之后,您将获得 xdy 形式的骰子信息。

考虑到这些限制,以下是应该起作用的东西:

function getRollParameters(inputCommand) {

  var inputWords = inputCommand.split(' '); //Split our input around the space, into an array containing the text before and after the space as two separate elements.

  var diceInfo = inputWords[1]; //Store the second element as "diceInfo"

  var diceDetails = diceInfo.split('d'); //Split this diceInfo into two sections, that before and after the "d" - ie, the number of dice, and the sides.

  //assign each part of the dicedetails to an appropriate variable
  var dice = diceDetails[0];
  var sides = diceDetails[1];

  //return our two pieces of information as a convenient object.
  return {
    "dice": dice,
    "sides": sides
  };
}
//a couple of demonstrations
console.log(getRollParameters("roll 5d8"));
console.log(getRollParameters("roll 126d2"));

实际上,我们首先将字符串拆分为“命令”和“参数”——我们想要的信息。然后,我们使用“d”作为中点来拆分我们的论点。这给了我们两个数字——一个在 d 之前和一个在 d 之后。然后我们将这些值分配给变量,并且可以随意使用它们。

这显然不会处理更有创意或更灵活的输入,并且在所示示例之外没有经过测试,但它应该是一个不错的起点。

【讨论】:

  • 很好的例子!在 OP 的情况下,我建议还检查文本以确保它包含“滚动”并相应地执行适当的操作。不过,这是直接解析参数部分之外的一些代码。
  • 你仍然需要从字符串中解析整数。
猜你喜欢
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 2014-01-24
  • 2012-01-22
  • 1970-01-01
相关资源
最近更新 更多