2016-02-18 12 views
5

Sono in difficoltà con una regex per fermarsi alla fine della linea.Regex: mancata corrispondenza di fine riga

ingresso assomiglia a questo:

How text spacing looks in Notepad++

Alcune linee hanno valori (può contenere qualsiasi carattere) dopo i due punti, alcuni non lo fanno. Ci possono essere spazi su entrambi i lati del colon, potrebbe non esserci.

Per le linee 2 e 4 il seguente lavoro (cioè partita 12 e 16 rispettivamente):

Pink\s*:\s*(.*)\n 
Red\s*:\s*(.*)\n 

Ma per la linea 3 (dove non c'è valore per abbinare), una regex utilizzando la sintassi sopra restituisce 16 , cioè legge oltre la fine della linea.

Qualcuno può suggerire cosa sto facendo male? Sto usando VBA.

+0

Ho appena notato un doppio punto in più prima di 16 nell'esempio, quindi in realtà: 16 che viene restituito, ma non è pertinente alla domanda. – QAer

+0

È necessario sostituire '\ s' con' [\ t] '. O con '[^ \ S \ r \ n]'. –

risposta

3

Il problema è che la classe di caratteri stenografici \s corrisponde allo spazio bianco verticale e orizzontale. Cioè, corrisponde a spazi e sequenze di nuova riga.

Quindi è necessario restringerlo per abbinare solo spazi bianchi orizzontali.

È necessario sostituire \s con [ \t] o con [^\S\r\n\v].

+2

Fantastico, grazie per questa spiegazione e soluzione. – QAer