I don't see a simple, non-invasive way for achieving that in the grammar. As a first attempt, I would use the following construct.
NameAndVersion: ...; //appropriate datatype rule
Adapt the name provider to extract the actual name (without version) and calculate the version from nameAndVersion when necessary. The latter could be done as an extension method or you use an external metamodel with a corresponding getter,... the list of possibilities not being complete.
calculate the version ... when necessary ... could be done as an extension method
Xtends extension methods will only be used while generating source code, right? I do not generate source code or any other kind of text artifacts. So I can't use extensions methods.
My next idea ist to use a customized ValueConverter bound to the data type rule "NameAndVersion" to split the matched string into the two parts "name" and "version" (key-value pairs) and vice versa. But ecore::EMap isn't serializable und thus not usable as the return type of a data type rule. (error is: The attribute 'Identifier.nav' is not transient so it must have a data type that is serializable) It seems likely that I have to define a new meta model to be used as the return type of that data type rule.
Extension methods will be used whenever you write Xtend code (instead of Java). If you want to stick to Java, simply use a static method for extracting the version. This will be the simplest solution. Depending on how often you need to access the version of the object, an imported metamodel with the corresponding getter will be better.