/
^#start of line
(?![^\n!]*!{2,})
(?=[^_\n]*_[^_]*) #if _ exists, then:
([^_:]+) #mandatory group 1
((?=:[^:\n]):[^:_(\n]+|) #optional group 2
(_(?!_)) #group 3 mandatory
([^_\-(\n]+) # group 4 mandatory
\( #mandatory (
([^()\n]+) # group 5 mandatory
\) #mandatory )
((?=!)!|) # group 6 optional
((?=:[^!:@\n]):[^!:@\n]+|) # group 7 optional
((?=::[^!:@\n])::[^!:@\n]+|) #group 8 optional
((?=@[^!:@\n])@[^!:@\n]+|) #group 9 optional
$ #end of line
/
gmx