/
^#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 )
((?=!)!|) #