| Bytes | Lang | Time | Link |
|---|---|---|---|
| 266 | Python 3 | 250309T170611Z | slow-jau |
| 144 | JavaScript V8 | 250311T130922Z | Steve Be |
| 104 | Perl 5 | 160111T000923Z | faubi |
| 172 | JavaScript ES7 | 160110T233428Z | ETHprodu |
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
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`
`
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`
`
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!