2016-03-09 26 views
5

Sto facendo un'applicazione Windows molto semplice utilizzando Visual Studio e C# che modifica i file dei sottotitoli per i filmati. Voglio un programma che aggiunge uno spazio alle frasi di dialogo quando non ce n'è uno. Ad esempio:C# - Come sostituire i caratteri accentati, ad esempio "-É" con "- É"

-Hey, come va?

-Niente molto.

a

- Ehi, come va?

- Niente di molto.

Ho utilizzato la casella degli strumenti per creare un'interfaccia con un solo pulsante per la selezione del file corretto. Questo è il codice che ho per questo pulsante:

private void button1_Click(object sender, EventArgs e) 
    { 
     if (openFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      string text = File.ReadAllText(openFileDialog1.FileName, Encoding.GetEncoding("iso-8859-1")); 
      text = text.Replace("-A", "- A"); 
      File.WriteAllText(openFileDialog1.FileName, text, Encoding.GetEncoding("iso-8859-1")); 
     } 
    } 

Quello che fa è fondamentalmente sostituire "-A" con "- A", creando così uno spazio. Questa è la soluzione che ho trovato e stavo pianificando di farlo con ogni lettera, comprese le lettere accentate, come À, Á, È, É, ecc. Ecc.

Questo non funziona . Se inserisco text = text.Replace ("- É", "- É"); il programma non fa nulla.

Quello che voglio sapere è come aggiustarlo.

Grazie per la lettura e se si dispone di un'alternativa migliore per la mia applicazione, non esitate a farmelo sapere.

+0

Hai bisogno di ricerca 'regex'. Non devi farlo manualmente per ogni lettera possibile! – Blorgbeard

+0

Usa 'regex.Replace()' – Harsh

+0

Come menzionato @Blorgbeard, potresti essere in grado di fare qualcosa di semplice come 'text = new Regex ("^- "). Sostituisci (testo," - ")' – Rob

risposta

5

Per quanto riguarda i commenti, utilizzare Regex.

 var rx = new System.Text.RegularExpressions.Regex("^-([^ ])"); 
     ... in your loop 
     var text = rx.Replace(text, "- $1"); 

Fondamentalmente ciò che fa è che si cerca un trattino all'inizio della stringa, ma solo che non è seguita da uno spazio. Il simbolo() significa che il carattere che segue il trattino deve essere "salvato". Sostituisce le ricerche nella stringa fornita e sostituisce (doh!) Il testo con un trattino, uno spazio e lo stesso carattere precedentemente abbinati. Qualunque cosa sia.

Fonte: https://xkcd.com/208/

Edit: non si dispone di un ciclo, si dispone di una stringa contenente l'intero contenuto di un file in cui ogni linea dovrebbe contenere una linea sottotitolo (giusto?). Se questo è il caso, è possibile configurare l'espressione regolare per trattare la stringa come un elenco di righe, come questo:

 var rx = new Regex("^-([^ ])", RegexOptions.Multiline); 

Vai a questa violino per un esempio: https://dotnetfiddle.net/ciFlAu

+0

Grazie mille. Ho alcune domande: 1 - Il 'System.Text.RegularExpressions.Regex' appare in grigio e se passo il mouse su di esso, dice" Il nome può essere semplificato ". È importante? 2 - Non ho capito cosa intendevi per '... nel tuo ciclo'. Lo so bene, ho iniziato solo C# ieri. Il tuo codice non ha funzionato sulla mia applicazione, non ha cambiato il file dei sottotitoli. Hai qualche idea del perché? –

+0

1 - se nel file è già utilizzato System.Text.RegularExpressions, non è necessario il nome completo. Così puoi semplificarlo senza preoccupazioni. 2 - Ora mi rendo conto che non hai un ciclo nel tuo codice. Devi fornire alcune opzioni alla regex. Fammi controllare su di loro. –

+0

La tua modifica ha funzionato perfettamente. Grazie mille! Qui stavo per scrivere dozzine di righe, una per ogni possibile lettera, e l'hai risolta con una sola riga. Questa è l'efficienza! Grazie ancora. –

1

Per carattere accentato, in considerazione di usare la sua rappresentazione Unicode:

string text = "-\u00C9"; //-É 
text = text.Replace("-\u00C9", "- \u00C9")); 

E si potrebbe anche utilizzare lo spazio no-break per la sostituzione dello spazio, nel caso in cui:

string text = "-\u00C9"; 
text = text.Replace("-\u00C9", "-\u00A0\u00C9")); 

Quindi è possibile codificare usando UTF-8/UTF-16:

File.WriteAllText(openFileDialog1.FileName, text, Encoding.GetEncoding("UTF-8"));