Вот мое регулярное выражение:
^[0-9\(\)\*\+\/\-\sd]*$
Это соответствует таким вещам, как: '2d6', '(3d6) + 3', et c.
Но оно также соответствует: ' 3d '
Я хочу, чтобы любая буква d всегда была , за которой следовало за 1 или более цифрами.
Если вы действительно хотите сопоставить некоторую произвольную строку ограниченного набора символов (например, (2511****d4+++(), но также убедитесь, что за d следует число, то вы можете разделить regex в две альтернативы (…|…):
(2511****d4+++(
d
(…|…)
^([\d\(\)\*\+\/\-\s]|d\d+)*$ ------------------ ---- | | single characters dN
Но если вы хотите сопоставить более конкретный шаблон c, такой как number d number, необязательно заключенный в скобки , за которым, возможно, следует operator number, тогда вам понадобится улучшенное регулярное выражение. Например:
number
operator
^(\d+d\d+|\( *\d+d\d+ *\))( *[\+\-\*\/] *\d+)?$ ------- --------------- ---------- --- | | | | NdN ( NdN ) operator N
С третьей стороны, если ваша строка является произвольным математическим выражением, то вам , вероятно, понадобится что-то вроде парсер рекурсивного спуска для обработки вложенных выражений.