Ci provo...
A mio parere dovresti prima di tutto capire come immagazzinare l'output, cioè le varie parti estratte dalla stringa.
La tua pseudo-struttura andrebbe rivista meglio:
codice:
[
{
"": ["parola parola"]
},
{
"DO": ["parola parola"]
},
{
"RE": ["parola parola"]
}
]
Considerando come array i blocchi di parentesi quadre e come oggetti i blocchi di parentesi graffe, a mio parere più che usare degli oggetti in quel modo (con cui potresti avere dei problemi nella rappresentazione delle chiavi se ad esempio si tratta di stringhe vuote) potresti usare invece un semplice array bidimensionale (in sostanza un array di array), dove il primo elemento dell'array interno rappresenta una "stringa chiave" (chiamiamolo così, meglio che "separatore") mentre il secondo rappresenta la relativa "stringa associata" (cioè la parte di stringa che segue di fatto la chiave fino a trovare un'altra chiave o la fine della stringa).
Direi che l'output, partendo dal tuo esempio, potrebbe quindi essere esemplificato in questo modo:
codice:
[
["", "parola parola"]
["DO", "parola parola"]
["RE", "parola parola"]
]
Per ottenere questo output dalla stringa di partenza, potresti usare dei gruppi di cattura sulla tua espressione regolare.
Qui uno script d'esempio:
codice:
var str = "Ma quante LA braccia ti hanno MI stretto, tu lo RE sai per diven MI tar quel che LA sei che importa MI tanto tu non RE me lo di MI rai, purtroppo."
, keys = "DO|RE|MI|FA|SOL|LA|SI"
, reg = new RegExp("(?:^| *("+keys+") *)((?:.(?!"+keys+"))*)", "g")
, output = []
, grp
;
while (grp = reg.exec(str)){
output.push([grp[1]||"", grp[2]||""]);
}
In sostanza la regexp cattura i due gruppi, dove il primo restituisce un valore chiave inserito tra gli OR della stringa keys, mentre il secondo restituisce il resto della stringa che segue quel valore chiave (fino a trovarne un altro).
Il tutto poi va iterato col metodo exec() che restituisce appunto i vari match e dove si può costruire l'array output.
Vedi se può andar bene.