javascript - 用于骰子滚动系统和使用 javascript 捕获的正则表达式

标签 javascript regex regex-group

我正在尝试构建一个 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/

相关文章:

javascript - 推荐 slider 使用 Bootstrap 无法正常工作

Javascript 函数在按钮的 onclick 事件中没有被调用

java - 使用正则表达式使用转义字符(可以自转义)分割消息

python - 使用区分大小写和不区分大小写的混合模式的正则表达式查找文本中使用的人称代词的数量

regex - 如何更改我的正则表达式,以便将其正确应用于我尝试抓取的 URL?

ruby - 我如何使用 gsub 将正则表达式 ruby​​ 替换为第 10 组?

javascript - While 循环与 requestAnimationFrame

javascript - 如何更改 CSS 文件或隐藏 <link> 标签

javascript - 正则表达式让前瞻功能适用于字符串中的每个单独单词

用于通过特定字符分隔条目的正则表达式