2017-04-22 126 views
1

我想建立一个javascript骰子滚动系统,该系统可以捕获从一个文本框中输入字符串形式的骰子掷出请求的不同部分拍摄。有需要这几个关键部分,他们是在列表波纹管:正则表达式掷骰系统和使用JavaScript

  • 首先要求的骰子必须包含的字符d或d后跟一个整数例如任何长度:D10或D2或D1203,而不是Q1
  • 其次,你可以请求任意数量的该卷例如:10D2或20D2但不需要d或d之前的数量。
  • 第三这个数量可以通过添加负号或次修改该数目由不同数量的例如:D10 + 10或D10 * 20
  • 此外,可以通过像D10 + D2
  • 1个其他掷骰子修改该数
  • 此外,您还可以通过使用括号在它的文本字符串修改与来自用户的请求数量掷骰子如:D10 +(强度)
  • 最后的最后3分可以,如果需要做的无数次一些原因,例如:1D10 * 10 + 2

我甚至不知道这是否可能,因为我不是很大的k现在正则表达式。我已经取得了一些进展,但是,我正在用最后一步打到路障。 我不需要它来实际进行计算,我只需要它将所有内容拆分成组并验证字符串是否与规则匹配。 这是我到目前为止有:

/([\d]*?)([dD][\d]*)(([\+\-\*])[\d]|([\+\-\*])\(([a-zA-Z]*)\))?/gmi 

编辑: 重写我需要什么样的要求通过@sln

我在寻找的东西,可以使一个正则表达式,可以用绳子一样工作这样的:

10D6([+-*/](number|\(userInput\)|D6)) 

因此,用户可以要求他们推出10个D6骰子,并添加任何的预定数量的用户输入或骰子。然而,在D6之后,10并不是必需的,但是,在D6之后的所有东西都需要一个数学符号和三个符号之一。 D6之后的小组可以完成无数次。该D6可边的任何金额,只要你喜欢,以及

最后我创造出了不同的字符串,我需要它的工作列表的regex101。 https://regex101.com/r/VJdgmw/2

+0

这将是很好看您正则表达式近。然而,你的描述中含糊不清,没有任何关联。成功的正则表达式的关键是对需求的严格定义。将所有部分重写为_one entity_。将所有选项放在括号中:'D5 [[+/* 10 |(user)],[+ D5]]'就像你解释命令行选项一样。 – sln

+0

@sln我已经尽力去做你最擅长的问题,但我不知道这是否会有所帮助 –

+0

好吧,我来看看。 – sln

回答

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组中被捕获,因此您需要进一步处理它的内容。

+1

非常感谢你,这是完美的,正是我所需要的。 –

+0

不客气,祝你好运。 – sln