用于骰子滚动系统的REGEX和使用javascript捕获

时间:2017-04-22 21:46:57

标签: javascript regex regex-group

我正在尝试构建一个javascript骰子滚动系统,它可以从文本框中以字符串的形式捕获骰子滚动请求的不同部分。这需要几个关键部分,它们列在下面的列表中:

  • 首先,请求的骰子必须包含字符d或D,后跟任意长度的整数,例如:D10或d2或D1203而不是q1
  • 其次,您可以请求任意数量的此卷,例如:10D2或20D2,但不需要D或d之前的数字。
  • 第三,这个数字可以通过添加减号或乘以不同的数字来修改,例如:D10 + 10或d10 * 20
  • 此外,您可以通过另外一个骰子滚动修改此号码,如D10 + D2
  • 此外,您可以使用带有文本字符串的括号来修改用户请求号码的骰子卷,例如:D10 +(强度)
  • 最后,如果出于某种原因需要,最后3分可以无数次完成,例如:1D10 * 10 + 2

我甚至不知道这是否可行,因为我对正则表达式的了解不多。我已经取得了一些进展,但是,我在最后一点遇到了障碍。 我不需要它来实际进行计算我只需要它将所有内容拆分成组并验证字符串是否符合规则。 这就是我到目前为止所做的:

/([\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

1 个答案:

答案 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组中捕获整个中间部分。