2013-08-02 17 views
6

Sto provando a costruire un'espressione regolare che abbinerà un carattere di nuova linea solitario (\n).Regex per abbinare la singola nuova linea. Regex per abbinare la doppia nuova riga

Allo stesso modo, ho bisogno di un altro regex per abbinare doppia a capo (\n\n) che non fanno parte di un più lungo periodo di caratteri di nuova riga come \n\n\n o \n\n\n\n\n\n ecc

\n(?!\n) e \n\n(?!\n) partita troppo (che corrisponde l'ultimo ritorno a capo (s) in una sequenza più lunga di newline). Cosa posso fare invece?

+0

Beh, non mi piace un simile commento. Perché mai pensi di non aver provato niente? –

+1

@KenOKABE. Come diamine sapremmo che hai provato qualcosa, a meno che non ci mostri cosa hai provato? Sei stato su 'SO' per quasi 2 anni. Dovresti conoscere le regole. –

+1

@KenOKABE: Se non ti piacciono questi commenti [controlla l'help-center su come evitarli] (http://stackoverflow.com/help/asking): una buona domanda mostra ciò che hai già provato, e dove hai guardato. Ciò evita che altri utenti pubblichino risposte con ciò che hai già provato. –

risposta

7

Poiché JavaScript non supporta affermazioni lookbehind, è necessario abbinare un carattere aggiuntivo prima tuoi \ n`s e ricordarsi di trattare con esso più tardi (cioè, ripristinalo se usi la corrispondenza regolare per modificare la stringa originale).

(^|[^\n])\n(?!\n) 

corrisponde a un singolo ritorno a capo più il carattere precedente, e

(^|[^\n])\n{2}(?!\n) 

partite doppie a capo più il carattere precedente.

Quindi, se si desidera sostituire un singolo \n con un <br />, per esempio, si hanno a che fare

result = subject.replace(/(^|[^\n])\n(?!\n)/g, "$1<br />"); 

Per \n\n, è

result = subject.replace(/(^|[^\n])\n{2}(?!\n)/g, "$1<br />"); 

vedere sul regex101

Spiegazione:

(  # Match and capture in group number 1: 
^  # Either the start of the string 
|  # or 
[^\n] # any character except newline. 
)  # End of group 1. This submatch will be saved in $1. 
\n{2} # Now match two newlines. 
(?!\n) # Assert that the next character is not a newline. 
+1

Sì, roba carina, tuttavia, cosa succede se vogliamo raccogliere le corrispondenze in una matrice anziché sostituirle? Puoi farlo senza una funzione di supporto? – georg

+0

Grazie. Rispetto il sondaggio condotto su questo tema e aspetto ulteriori discussioni. Detto questo, ho bisogno di questa tecnica per sostituire. Grazie mille. Che ne dici di single \ n? Mi manca qualcosa di molto semplice ?? –

+0

@ thg435: Perché dovresti abbinare una serie di stringhe identiche in un array? Sai già che una partita consiste di due newline (scontando il carattere extra) :) –

1

Per corrispondere esattamente a N ripetizioni dello stesso carattere, è necessario guardare avanti e guardare indietro (vedere Match exactly N repetitions of the same character). Dal momento che javascript non supporta quest'ultimo, una soluzione puramente regexp sembra essere impossibile. Dovrete usare una funzione di supporto, ad esempio:

> x = "...a...aa...aaa...aaaa...a...aa" 
"...a...aa...aaa...aaaa...a...aa" 
> x.replace(/a+/g, function($0) { 
     return $0.length == 2 ? '@@' : $0; 
    }) 
"[email protected]@[email protected]@" 
+2

Bene, puoi farlo senza guardare indietro, se sei disposto ad abbinare più che solo le nuove linee e ad occuparti di quel personaggio in più in seguito. –

+0

Grazie per l'input. Molto informativo. thg435 –

Problemi correlati