g | x | w | all
Bytes Lang Time Link
266Python 3250309T170611Zslow-jau
144JavaScript V8250311T130922ZSteve Be
104Perl 5160111T000923Zfaubi
172JavaScript ES7160110T233428ZETHprodu

Python 3, 266 bytes

from itertools import*
n=None
w=lambda t,v:[]if t==""else next(([s]+r for s in v if s==t[:len(s)]and(r:=w(t[len(s):],v))is not n),n)
f=lambda x:"\n".join([f"{p}:{'.'.join(y)}."for p in["".join(x)for x in permutations("SVO")]if(y:=w(x,["V",p.replace("O",""),p]))!=n])

JavaScript (V8), 144 bytes

s=>[o='',1,2,5,6,7].map(i=>(r='SVOSVVSOVS'.slice(i,i+3),j=s.match(RegExp(i%2?r+'|VS?':r+'|S?V','g')),j.join``==s)&&(o+=r+`:${j.join`.`}.\n`))&&o

Try it online!

JavaScript (V8), 152 bytes

s=>[0,1,2,5,6,7].map(i=>(r='SVOSVVSOVS'.slice(i,i+3),j=s.match(RegExp(i%2?r+'|VS?':r+'|S?V','g')),j.join``==s)&&r+`:${j.join`.`}.`).filter(a=>a).join`
`

Try it online!

JavaScript (V8), 160 bytes

s=>[/VOS|VS?/g,/VSO?|V/g,/OVS|VS?/g,/OSV|S?V/g,/SVO?|V/g,/SOV|S?V/g].map(r=>(j=s.match(r),j.join``==s)&&(r+'').slice(1,4)+`:${j.join`.`}.`).filter(a=>a).join`
`

Try it online!

JavaScript (ES6), 164 bytes

This solution borrows some ideas from ETHproductions.

s=>`VOS|VS?
VSO|VS?
OVS|VS?
OSV|S?V
SVO|S?V
SOV|S?V`.split`
`.map(r=>((j=s.match(new RegExp(r,'g'))).join``==s)&&r.slice(0,3)+`:${j.join`.`}.`).filter(a=>a).join`
`

JavaScript (ES6), 184 bytes

This was my original solution.

s=>'VOS|VS? VSO|VS? OVS|VS? OSV|S?V SVO|S?V SOV|S?V'.split` `.map(r=>(j=q=>new RegExp(q,'g'))(`^(${r})+$`).test(s)&&r.slice(0,3)+':'+s.replace(j(`(${r})`),'$1.')).filter(a=>a).join`\n`

Perl 5 - 104 bytes

$a=<>;for(qw/VSO VOS SVO OVS SOV OSV/){$s=s/O//r;print"$_:".$a=~s/($_|$s|V)/$1./gr if$a=~/^($_|$s|V)*$/}

JavaScript (ES7), 172 bytes

x=>[for(i of"V(SO?)?0V(O?S)?0(SVO?|V)0(O?VS|V)0(SO?)?V0(O?S)?V".split(0))if((y=x.match(RegExp(i,"g"))).join``==x)i.match(/\w/g).slice(0,3).join``+":"+y.join`.`+"."].join`
`

Could probably be golfed further. Suggestions welcome!