View Full Version : Espressioni regolari per semplificare listato C++
legolas977
01-03-2013, 19:04
Mi trovo a dover semplificare con Notepad++ un lungo listato in C contentente tantissime voci.
Faccio un esempio con una piccola parte:
,,,
Buffer[parte_da_eliminare_1]=WordBlocco;
Buffer[parte_da_eliminare_2]=WordBlocco;
Buffer[parte_da_eliminare_3]=WordBlocco;
Buffer[parte_da_eliminare_4]=WordBlocco;
,,,
voglio ottenere:
Buffer[]=WordBlocco;
Buffer[]=WordBlocco;
Buffer[]=WordBlocco;
Buffer[]=WordBlocco;
In pratica con Notepad++ quando faccio "sostituisci" ed abilito le "espressioni regolari", volevo sapere che sintassi utilizzare per eliminare i caratteri alfanumerici che ho nell'esempio di sopra.
Mi scuso se vi faccio perdere tempo, ma ho cercato un po in rete, e per una stupidata di questo tipo non c'è un esempio immediato
Grazie mille
wingman87
01-03-2013, 19:46
Prova così
Stringa da ricercare:
(\w+\[)(\w+)(\]=\w+;)
Sostituisci con:
$1$3
legolas977
01-03-2013, 20:18
Funziona alla grande grazie!
Mi puoi spiegare in breve la sintassi?
Grazie mille
wingman87
01-03-2013, 20:58
Per studiare approfonditamente la sintassi ti consiglio questo tutorial:
http://www.regular-expressions.info/tutorial.html
Nella regex che ho usato sono definiti 3 gruppi (delimitati dalle parentesi tonde). I gruppi qui servono per referenziarli nella sostituzione
(\w+\[)
(\w+)
(\]=\w+;)
\w+ significa un qualunque carattere A..Z o a..z o 0..9 o underscore ripetuto da 1 a n volte
\[ significa il carattere '['. '\' è il carattere di escape e va usato quando vuoi fare il match di caratteri riservati
\] idem
'=' e ';' non sono caratteri riservati, effettuano il match di sé stessi
Infine nella stringa di sostituzione $1 e $3 referenziano il primo e il terzo gruppo
legolas977
01-03-2013, 21:26
Grazie mille
Che gentile!
:cincin:
legolas977
01-03-2013, 21:51
Ho un altro caso, come mi comporto se:
ho:
Case 0x0001:
Buffer[parte_da_eliminare_1]=WordBlocco;
Array[rimane1]=WordBlocco;
break;
case 0x0002:
Buffer[parte_da_eliminare_2]=WordBlocco;
Array[rimane2]=WordBlocco;
break;
case 0x0003:
Buffer[parte_da_eliminare_3]=WordBlocco;
Array[rimane3]=WordBlocco;
break;
case 0x0004:
Buffer[parte_da_eliminare_4]=WordBlocco;
Array[rimane4]=WordBlocco;
break;
,,,
voglio ottenere:
Case 0x0001:
Buffer[]=WordBlocco;
Array[rimane1]=WordBlocco;
break;
case 0x0002:
Buffer[]=WordBlocco;
Array[rimane2]=WordBlocco;
break;
case 0x0003:
Buffer[]=WordBlocco;
Array[rimane3]=WordBlocco;
break;
case 0x0004:
Buffer[]=WordBlocco;
Array[rimane4]=WordBlocco;
break;
Rigrazie mille
wingman87
01-03-2013, 22:04
Direi
(Buffer\[)(\w+)(\]=\w+;)
E la stringa di sostituzione di prima
legolas977
01-03-2013, 22:12
Perfetto, dai faccio un pò di prove! Graziusss!
legolas977
02-03-2013, 07:12
Se volessi inserire la stringa "Stato" dentro alle quadre, come modifico "$1$3" ?
Per dire, inserire:
Case 0x0001:
Buffer[Stato]=WordBlocco;
Array[rimane1]=WordBlocco;
break;
case 0x0002:
Buffer[Stato]=WordBlocco;
Array[rimane2]=WordBlocco;
break;
case 0x0003:
Buffer[Stato]=WordBlocco;
Array[rimane3]=WordBlocco;
break;
case 0x0004:
Buffer[Stato]=WordBlocco;
Array[rimane4]=WordBlocco;
break;
:p
wingman87
02-03-2013, 10:37
$1Stato$3
legolas977
02-03-2013, 11:42
ops mi sono spiegato male,
intendevo partendo da questa situazione:
Case 0x0001:
Buffer[]=WordBlocco;
Array[Stato]=WordBlocco;
break;
case 0x0002:
Buffer[]=WordBlocco;
Array[Stato]=WordBlocco;
break;
case 0x0003:
Buffer[]=WordBlocco;
Array[Stato]=WordBlocco;
break;
case 0x0004:
Buffer[]=WordBlocco;
Array[Stato]=WordBlocco;
break;
riempire con Stato le quadre vuote.
Ho visto che funziona cosi:
(Buffer\[) () (\]=\w+;)
e
$1Stato$3
Però non mi spiego le parentesi con dentro niente :D
wingman87
02-03-2013, 11:49
Sì, quelle parentesi le puoi togliere, però nella stringa di sostituzione dovrai usare $2 al posto di $3.
In verità quelle parentesi si potevano togliere sin dall'inizio ma mi sembrava più chiaro così...
legolas977
02-03-2013, 16:35
Mi è sorto un altro dubbio mentre eseguivo i miei confronti, è anche possibile con le espressioni regolari eliminare le righe vuote?
ovvero
da cosi:
Case 0x0001:
Buffer[]=WordBlocco;
Array[Stato]=WordBlocco;
break;
case 0x0002:
Buffer[]=WordBlocco;
Array[Stato]=WordBlocco;
break;
a così:
Case 0x0001:
Buffer[]=WordBlocco;
Array[Stato]=WordBlocco;
break;
case 0x0002:
Buffer[]=WordBlocco;
Array[Stato]=WordBlocco;
break;
Ririgrazie :)
wingman87
03-03-2013, 00:03
Mi sembra che la ricerca con regex di notepad++ non supporti la ricerca su più linee, nel senso che fa il match solo su una riga per volta...
Se però le righe sono proprio vuote puoi usare la modalità di ricerca estesa (quella con \n, \r, \t, ecc...) e sostituire \r\n\r\n con \r\n
legolas977
03-03-2013, 00:13
Come cambia da \r\n\r\n a \r\n ?
nel senso che devo cercare \r\n\r\n e sostituire con \r\n ?
legolas977
03-03-2013, 00:15
wow funziona anche questo, che spettacolo! volevo capire il perchè funziona :-)
wingman87
03-03-2013, 15:46
\r è il carattere di carriage return, \n è il carattere di line feed. Puoi trovare altre info cercandoli con questi nomi.
Su windows quando vai a capo vengono inseriti questi due caratteri in sequenza.
Cercando \r\n\r\n trovi le righe vuote perché per ognuna di esse la riga precedente termina con \r\n, mentre la riga corrente è composta solo da \r\n.
Ovviamente questo procedimento funziona solo se le righe vuote sono davvero vuote, cioè senza spazi o tabulazioni.
Se eri su linux invece avresti dovuto sostituire \n\n con \n
legolas977
03-03-2013, 20:14
Tutto chiaro.
Felicissima serata.
Grazie
;)
legolas977
03-04-2013, 18:10
Ho un altro dubbio con le espressioni regolari.
Non riesco a trovare un modo per poter eliminare una riga senza lasciarla vuota.
Esempio:
Dato il seguente listato :
100001
200001
100002
100003
100004
100005
100006
200001
100007
Devo ottenere:
100001
100002
100003
100004
100005
100006
100007
In pratica devo eliminare 200001 compresa la sua riga.
Potete aiutarmi?
Grazie mille!!!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.