我正在尝试构建一个javascript骰子滚动系统,它可以从文本框中以字符串的形式捕获骰子滚动请求的不同部分。这需要几个关键部分,它们列在下面的列表中:
我甚至不知道这是否可行,因为我对正则表达式的了解不多。我已经取得了一些进展,但是,我在最后一点遇到了障碍。 我不需要它来实际进行计算我只需要它将所有内容拆分成组并验证字符串是否符合规则。 这就是我到目前为止所做的:
/([\d]*?)([dD][\d]*)(([\+\-\*])[\d]|([\+\-\*])\(([a-zA-Z]*)\))?/gmi
编辑: 按@sln
的要求重写我需要的内容我正在寻找可以制作正则表达式的东西,可以使用这样的字符串:
10D6([+-*/](number|\(userInput\)|D6))
因此,用户可以要求他们滚动10个D6骰子并添加预定义的数字用户输入或骰子滚动。然而,D6之后的所有内容都不是必需的,但D6之后的所有内容都需要一个数学符号和之后的三个内容之一。 D6之后的组可以无限次地完成。 D6可以是你喜欢的任何数量的一面
最后我创建了一个regex101,它有一个我需要它的不同字符串列表。 https://regex101.com/r/VJdgmw/2
答案 0 :(得分: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组中捕获整个中间部分。