Aiutino regex con negative lookahead

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
eb-ash
Prode Principiante
Messaggi: 204
Iscrizione: lunedì 18 febbraio 2019, 18:02
Sesso: Maschile

Aiutino regex con negative lookahead

Messaggio da eb-ash »

Scusatemi ma utilizzo i comandi per farmi qualche scriptino per diletto ma è tanto che non li uso e mi sono dimenticato delle cose.
Come faccio a dirgli che non deve fare la sostituzione se la stringa incomincia con un numero?

Codice: Seleziona tutto

perl -pe "s/'s(?=(((?"'!'"\)).)*\()|[^\(\)]*$)/XXs/gi"
si è vero uso un mac. Ma detesto i maccisti del web. Se la tirano, non ti aiutano, sono abituati ad avere la pappa fatta e non costruirsi le cose, e sono troppo pochi... quando serve non ci sono mai. Voglio imparare un po' di Bash per fare tante cose utili perchè questo sono qua... senza formazione specifica ma in fondo è unix che permette di fare le cose a pezzetti, no?
ductive
Prode Principiante
Messaggi: 3
Iscrizione: venerdì 8 dicembre 2023, 20:31
Desktop: HP

Re: Aiutino regex con negative lookahead

Messaggio da ductive »

Ciao, mi sono trovato in una situazione simile e francamente non ho trovato una soluzione. quindi spero che qualcuno scriva in questa discussione e ci aiuti.
nicNiz
Prode Principiante
Messaggi: 47
Iscrizione: domenica 4 ottobre 2020, 20:31

Re: Aiutino regex con negative lookahead

Messaggio da nicNiz »

Ciao. Non conosco le regex, ma ho creato al volo un comando c++ (kisn: keep if starts number)
Questo il link per scaricare l'eseguibile https://drive.google.com/file/d/1YBNqQL ... sp=sharing
Una volta dati i permessi, da terminale:

Codice: Seleziona tutto

/path/kisn file|testo stringaDaSostituire nuovaStringa
es: ./kisn "mele 20mele melegnano melensomele 6mele uva" mele pere
>> pere 20mele peregnano perensopere 6mele uva
Il mio Linguaggio di scripting dichiarativo
https://dunocode.altervista.org
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4444
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Aiutino regex con negative lookahead

Messaggio da UbuNuovo »

Non mi sono messo a decifrare la regex criptica, sono cotto come una pera, non hai messo neanche un esempio.
Normalmente in questi casi non c'è bisogno di scomodare sintassi particolari,
basta indicare cosa non deve esserci all'inizio della riga in modo da non avere la corrispondenza.

Esempio di codice

Codice: Seleziona tutto

txt='1 questa riga non è buona
invece questa è buona
123 questa non è buona, inizia con un numero'
negando i caratteri possibili (numerici) all'inizio prima di "questa"

Codice: Seleziona tutto

grep -P '^[^0-9]+.*questa' <<< "$txt"
stessa cosa per la sostituzione di "questa" con "quest'altra" nelle righe che non iniziano con un numero.

Codice: Seleziona tutto

perl -pe "s/^[^0-9]+questa/quest'altra/" <<< "$txt"
esecuzione nel terminale:

Codice: Seleziona tutto

8-) txt='1 questa riga non è buona
> invece questa è buona
> 123 questa non è buona, inizia con un numero'
8-) grep -P '^[^0-9]+.*questa' <<< "$txt"
invece questa è buona
8-) perl -pe "s/^[^0-9]+questa/quest'altra/" <<< "$txt"
1 questa riga non è buona
quest'altra è buona
123 questa non è buona, inizia con un numero
8-) 
Salva l'Ucraina! 🇺🇦
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Aiutino regex con negative lookahead

Messaggio da rai »

UbuNuovo ha scritto:
domenica 14 aprile 2024, 19:05
...
non hai messo neanche un esempio.
Normalmente in questi casi non c'è bisogno di scomodare sintassi particolari,
basta indicare cosa non deve esserci all'inizio della riga in modo da non avere la corrispondenza.
:ciao:
è vero che eb-ash non ha messo nemmeno un esempio però ha parlato di stringa, non di riga: in questo caso un lookbehind negativo potrebbe servire per cambiare in kiwi tutte le occorrenze di mele non precedute da cifre all'inizio della parola.

Codice: Seleziona tutto

$ testo="duemele mele2 mele 2mele
pere
altre due2mele"
$
$ perl -pe s/'(?<!\b\d)mele'/kiwi/g <<< "$testo"
duekiwi kiwi2 kiwi 2mele
pere
altre due2kiwi
$ 

per ottenere il comportamento
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2868
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

Re: Aiutino regex con negative lookahead

Messaggio da DoctorStrange »

Ma non sarebbe piu semplice creare la regex, in modo che trovi tutte le stringhe che cominciano con il numero o che comunque rispondano al criterio inverso, e poi negare globalmente il risultao ottenuto?
Oppure, in alternativa, trovi tutte le stringhe che NON rispondono al tuo criterio e poi, con una sottrazione dell'insieme di partenza, ciò che resta sarà sicuramente ciò che cercavi fin dall'inizio.
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Aiutino regex con negative lookahead

Messaggio da rai »

DoctorStrange ha scritto:
ieri, 10:00
Ma non sarebbe piu semplice creare la regex, in modo che trovi tutte le stringhe che cominciano con il numero o che comunque rispondano al criterio inverso, e poi negare globalmente il risultao ottenuto?
Oppure, in alternativa, trovi tutte le stringhe che NON rispondono al tuo criterio e poi, con una sottrazione dell'insieme di partenza, ciò che resta sarà sicuramente ciò che cercavi fin dall'inizio.
:ciao:
fermo restando che non sappiamo con precisione cosa è che l'OP deve sostituire o meno, la regex che ho messo sopra matcha tutte le occorrenze di substringa salvo quando la parola che contiene substringa inizia con un numero. Oltre a essere più semplice, mi pare anche più efficiente rispetto al sistema che descrivi tu. A meno di essere smentito dal tuo codice
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4444
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Aiutino regex con negative lookahead

Messaggio da UbuNuovo »

@rai: Le righe le avevo in testa io! E anche i pois e gli elefantini rosa.

ho visto che con numeri a più cifre non si può usare \d+, se ne deve dichiarare il numero (max 256 caratteri {0,255)})
il warning c'è ugualmente quindi per eliminarlo -X:

considerando numeri fino a 9 cifre:

Codice: Seleziona tutto

perl -X -pe 's/(?<!\b\d{1,9})mele/kiwi/g' <<< "$testo
con testo:

Codice: Seleziona tutto

testo="duemele mele2 mele 32mele
pere
altre due2mele"

Codice: Seleziona tutto

8-) perl -X -pe 's/(?<!\b\d{1,9})mele/kiwi/g' <<< "$testo"
duekiwi kiwi2 kiwi 32mele
pere
altre due2kiwi
Salva l'Ucraina! 🇺🇦
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 13 ospiti