【问题标题】:D&D-style compound dice expression regexD&D 风格的复合骰子表达式正则表达式
【发布时间】:2019-02-14 13:16:29
【问题描述】:

我正在开发一个涉及用户输入骰子表达式的 Java 项目。我正在使用正则表达式来验证输入,以确保它是有效的 D&D 风格的骰子表达式。我的意思是这样的表达方式:

d20
2D12+ 4 - 2
12d4-2d6+7 + d8
7 + 1d12

都是有效的。而像这样的表达:

-2d6+4
-d8 - 5
12
2d0 + 5
1d6 + 0d2 - 1
0d6

都将无效。 到目前为止,我设法制作的最接近的正则表达式是:

^((((0+\d+|[1-9]\d*|)(d|D)(0+\d+|[1-9]\d*))|(\d+))((\ *(\+|\-)\ *)(?=(((0+\d+|[1-9]\d*|)(d|D)(0+\d+|[1-9]\d*))|(\d+))))?)+$

但是,这个正则表达式仍然匹配像“0d6”这样的表达式。对此创建正则表达式的任何帮助将不胜感激。

【问题讨论】:

标签: java regex dice


【解决方案1】:

^(?!\d+$)(([1-9]\d*)?[Dd]?[1-9]\d*( ?[+-] ?)?)+(?<![+-] ?)$

解释:

^              | Enforce beginning of string
(?!\\d+$)      | If 1+ digits at end of string are matched, don't match the following:
(              | Begin group
  ([1-9]\\d*)? |   Optionally match numbers not starting with 0 of any length
  [Dd]?        |   Optionally match either "D" or "d"
  [1-9]\\d*    |   Match numbers not starting with 0 of any length
  ( ?[+-] ?)?  |   Optionally match a "+" or "-" optionally surrounded by spaces
)+             | End group; one or more of these should exist
(?<![+-] ?)    | A "+" or "-" with an optional space shouldn't precede the end
$              | Enforce end of string

Try it here

示例代码:

String userInput = "12d4-2d6+7 + d8";

Pattern p = Pattern.compile("^(?!\\d+$)(([1-9]\\d*)?[Dd]?[1-9]\\d*( ?[+-] ?)?)+$");
Matcher m = p.matcher(userInput);
boolean b = m.matches();

System.out.println(b); // true

【讨论】:

  • 正是我需要的!详细的解释特别有用。非常感谢!
  • @Surram 请注意,此正则表达式错误地匹配“7d+”。
  • @daniu 我不知道你是怎么理解的。我测试了该值,但它不匹配。
  • @Adam 你是对的,对不起,我打错了。错误匹配是“7d4+”。
  • 更新了正则表达式来解决问题。
猜你喜欢
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多