我正在尝试构建一个JavaScript骰子滚动系统,该系统可以从文本框中以字符串的形式捕获骰子滚动请求的不同部分。这样的关键部分很少,它们在列表中bellow:
- 首先,请求的骰子必须包含字符D或D,然后包含整数的任何长度,例如:D10或D2或D1203,而不是Q1
- 其次,您可以请求任何数量的卷,例如:10d2或20d2,但不需要D或D之前的数字。
- 第三可以通过添加负量或通过其他数字来修改此数字,例如:D10 10或D10*20
- 另外,您可以通过1个其他骰子卷来修改此数字,例如D10 D2
- 另外,您可以通过使用带有文本字符串的括号(例如:d10 (强度( (来修改用户请求的数字骰子卷
- 最后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,该Regex101具有我需要使用的不同字符串的列表。https://regex101.com/r/vjdgmw/2
好吧,我已经根据我的理解将其稀释了。
JS演示
/(d*)(Dd*)((?:[+*-](?:d+|([A-Z]*)))*)(?:+(Dd*))?/i
格式/解释
( 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组中捕获的,您想进一步处理其内容。