Sto analizzando il testo che è molte ripetizioni di un modello semplice. Il testo è nel formato di una sceneggiatura per un gioco, come questo:Espressione regolare per abbinare tutti i personaggi fino alla corrispondenza successiva
SAMPSON
I mean, an we be in choler, we'll draw.
GREGORY
Ay, while you live, draw your neck out o' the collar.
Attualmente sto usando il modello ([A-Z0-9\s]+)\s*\:?\s*[\r\n](.+)[\r\n]{2}
, che funziona bene (spiegazione di seguito) tranne quando il discorso del personaggio ha interruzioni di riga in esso . Quando ciò accade, il nome del personaggio viene catturato con successo ma viene catturata solo la prima riga del discorso.
L'attivazione della modalità a linea singola (per includere interruzioni di linea in .
) crea una corrispondenza gigantesca.
Come posso dire allo (.+)
di fermarsi quando trova il nome del personaggio successivo e terminare la partita?
Sto iterando su ogni singola partita (JavaScript), quindi il nome deve essere disponibile per la prossima partita.
Idealmente, sarei in grado di abbinare tutti i caratteri fino a quando l'intero schema non viene ripetuto.
modello ha spiegato:
Il primo gruppo corrisponde al nome di un personaggio (che permette lettere maiuscole, numeri e spazi bianchi), (con i due punti finali e gli spazi opzionale).
Il secondo gruppo (il discorso del personaggio) inizia su una nuova riga e cattura qualsiasi carattere (tranne, in modo problematico, interruzioni di riga e caratteri dopo di essi).
Il motivo termina (e ricomincia) dopo una riga vuota.
È necessario definire in modo inequivocabile come si determina dove il nome successivo inizia prima di poter scritto e una regex per abbinarla. È una parola singola seguita da due punti su una riga da sola? Questo si tradurrebbe in partite errate? – mellamokb
@mellamokb Ho dimenticato di includere l'ultima parte del pattern, che cerca una riga vuota. La partita inizia dal nome del personaggio (tutte le maiuscole sulla sua stessa riga) e termina nella riga vuota dopo il discorso. – Nathan
Credo che manchi i due punti nel testo di esempio, la regex non funziona con esso. –