D&D 风格的复合骰子表达式正则表达式
D&D-style compound dice expression regex
我正在 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”这样的表达式。非常感谢为此创建正则表达式的任何帮助。
^(?!\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
我正在 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”这样的表达式。非常感谢为此创建正则表达式的任何帮助。
^(?!\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