Если я вас правильно понимаю, шаблон, который вам нужен, выглядит примерно так:
/[0-9A-Za-z]+(-[0-9A-Za-z]+)*-[0-9]/
Я написал быстрый тест:
valid = [ 'A-a-A2-AXY-1', 'A-a-A2-A2Y-11', '14-a-A2-A2Y-11' ]
invalid = [ '-a-A2-AXY-A', 'A-a-A2-AXY-', 'A-a-A2-AXY-B' ]
pattern = /[0-9A-Za-z]+(-[0-9A-Za-z]+)*-[0-9]+/
valid.each { println "$it ${it ==~ pattern}" }
invalid.each { println "$it ${it ==~ pattern}" }
, который выдает:
A-a-A2-AXY-1 true
A-a-A2-A2Y-11 true
14-a-A2-A2Y-11 true
-a-A2-AXY-A false
A-a-A2-AXY- false
A-a-A2-AXY-B false
Так что, похоже, работает
Шаблон, вероятно, может быть сокращен путем использования групповых символов