我正在尝试构建一个 javascript 掷骰子系统,该系统可以从文本框中以字符串的形式捕获掷骰子请求的不同部分。为此需要几个关键部分,它们在下面的列表中:
- 首先,要求的骰子必须包含字符 d 或 D,后跟任意长度的整数,例如:D10 或 d2 或 D1203 而不是 q1
- 其次,您可以要求任何数字,例如:10D2 或 20D2,但不需要 D 或 d 之前的数字。
- 第三,可以通过添加减去或乘以不同的数字来修改此数字,例如:D10+10 或 d10*20
- 此外,您可以通过 1 个其他骰子掷骰修改此数字,例如 D10+D2
- 此外,您可以使用方括号中包含文本字符串的方式使用用户请求的数字修改骰子掷骰,例如:D10+(Strength)
- 最后,如果出于某种原因需要,最后 3 点可以无限次完成,例如:1D10*10+2
我什至不知道这是否可行,因为我对正则表达式了解不多。我取得了一些进展,但是,我遇到了最后一点障碍。 我不需要它来实际进行计算,我只需要它来将所有内容分成几组并验证字符串是否符合规则。 这是我目前所拥有的:
/([\d]*?)([dD][\d]*)(([\+\-\*])[\d]|([\+\-\*])\(([a-zA-Z]*)\))?/gmi
编辑: 按照@sln 的要求重写我需要的内容
我正在寻找可以制作可与这样的字符串一起使用的正则表达式的东西:
10D6([+-*/](number|\(userInput\)|D6))
因此用户可以要求他们掷 10 个 D6 骰子并添加用户输入的预定义数字或掷骰子。然而,10 不是必需的,也不是 D6 之后的所有内容,但是,D6 之后的所有内容都需要一个数学符号和它后面的三个东西之一。 D6之后的组可以做无限次。 D6也可以是你喜欢的任何边数
最后,我创建了一个 regex101,其中包含我需要使用的不同字符串的列表。 https://regex101.com/r/VJdgmw/2
最佳答案
好的,我已经根据我的理解把它精简了。
JS demo
/(\d*)(D\d*)((?:[+*-](?:\d+|\([A-Z]*\)))*)(?:\+ (D\d*))?/i
Formatted/解释
( \d* ) # (1)
( D \d* ) # (2), Dice 1, required
( # (3 start), modifiers
(?: # Cluster
[+*-] # + or - or *
(?: \d+ | \( [A-Z]* \) ) # either digits, or (name)
)* # End cluster, 0 to many times
) # (3 end)
(?:
\+ # +
( D \d* ) # (4), Dice 2, optional
)?
中间部分 (?:[+*-](?:\d+|\([A-Z]*\)))*
重复所以
无法单独捕获。
但是,整个中间部分都包含在第 3 组中,以防您想进一步处理它的内容。
关于javascript - 用于骰子滚动系统和使用 javascript 捕获的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43564985/