That page you linked me to was very helpful, thanks.
So I think the reason my code didn't work was due to about three different overlapping issues - no wonder I wasn't sure where to start

1) I had "attach with" command and also "attach" verb which conflicted with each other
2) I had tried to use the (xxx|yyy) syntax as part of a "Command Expression". I now know that this syntax only works as part of a "Regular Expression" ... to be honest until just now I hadn't even realised there was an option to select "Regular Expression" instead!
3) But if I use "Regular Expression", then I need to go the whole hog and do it entirely like that with all the little ^'s and $'s and so on - fortunately that link you gave me not only shows what needs to go in, but explains what it means, so I can follow why I'm putting in what I'm putting in.
And then the additional problem is that as soon as I use "Regular Expression", the semicolon syntax stops working, so I then can't tag on the "; attach [singlething]" on the end.
So what I now have - that works for "attach to" but doesn't work for "attach" - is this:
^(attach|fix) (?<objecttoattach>.*) (to|onto) (?<objectarget>.*)$
But the following of my best-but-useless-attempts-to-make-it-work all fail:
^(attach|fix) (?<objecttoattach>.*) (to|onto) (?<objectarget>.*)$; ^(attach|fix) (?<objectsingle>.*)
(^(attach|fix) (?<objecttoattach>.*) (to|onto) (?<objectarget>.*)$ | ^(attach|fix) (?<objectsingle>.*))
(?(^(attach|fix) (?<objecttoattach>.*) (to|onto) (?<objectarget>.*)$) ^(attach|fix) (?<objecttoattach>.*) (to|onto) (?<objectarget>.*)$ | ^(attach|fix) (?<objectsingle>.*) )
And after that, I ran out of ideas

Ah---
But I'm starting to wonder if that is indeed the right thing to be trying to do. Because if I look at the library commands, there's a "give" command, and a completely separate "givesingle" command.
GIVE COMMAND (Regular Expression): ^give (?<object1>.*) to (?<object2>.*)$
GIVE SINGLE COMMAND (Command Pattern): give #object#
So perhaps I should indeed be trying to have separate "Attach To" and "Attach" commands?
I wonder whether I then just need to make sure that the "Attach To" command is lower down in the code than the "Attach" command, so that when Quest reads the code upwards, it tries to match "Attach To" first.
...so I've just tried that, and it works for me - even though the "Attach" command is lower down than the "Attach to" command. So somehow it's able to realise that if I say "Attach tail to donkey", I want to use the "Attach to" command, yet it also knows that if I say "Attach donkey tail" that I'm looking for it to use the "Attach" command.
I have a feeling I still don't quite understand how it's doing what it's doing, which worries me a little, but I do seem to have solved the issue with your excellent help once again, which pleases me a little more

psy