D & D-стиль выражения регулярных выражений - PullRequest
0 голосов
/ 10 сентября 2018

Я работаю над проектом на 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". Любая помощь в создании регулярного выражения для этого будет высоко ценится.

1 Ответ

0 голосов
/ 10 сентября 2018

^(?!\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

Попробуйте здесь

Пример кода:

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
...