View Full Version : regex pipe (|)
Buon giorno,
sto utilizzando le espressioni regolari per validare una serie di dati in un programma, ma ho dei problemi con le espressioni alternative.
Per esempio, un valore tra 0 e 100 con valore 999 per non noto.
le singole parti mi funzionano correttamente (nessuna di queste accetta 200):
^[0-9]{1,2}$
^100$
^999$
se faccio:
^[0-9]{1,2}|100|999$
non funziona più e mi accetta pure 200 (tanto per fare un esempio)!
Cosa sbaglio nelle condizioni con il | (pipe)?
grazie
The_ouroboros
20-05-2013, 08:29
^(999|[0-9][0-9]|100)$
grazie,
nel frattempo avevo risolto chidendo e riaprendo la stringa:
^[0-9]{1,2}$|^100$|^999$credi che ci sia differenza tra le due?
The_ouroboros
20-05-2013, 12:44
il | usa tutto quello che c'è a destra o sinistra quindi se vuoi che ^$ sia sempre preso devi sempre riprenderlo
Pensala come
a|b a "oppure" b
In alternativa se vuoi prendere abba|aba puoi usare abb?a (? rende opzionale la lettera precedente o gruppo se racchiuso tra () )
The_ouroboros
20-05-2013, 12:46
puoi provarle "live" qui cmq: http://regexpal.com/
il | usa tutto quello che c'è a destra o sinistra quindi se vuoi che ^$ sia sempre preso devi sempre riprenderlo
Pensala come
a|b a "oppure" b
In alternativa se vuoi prendere abba|aba puoi usare abb?a (? rende opzionale la lettera precedente o gruppo se racchiuso tra () )
qual'è la differenza tra
egrep '^(|1)'
e
egrep '^(.|1)'
?
The_ouroboros
21-11-2014, 14:25
.
Sent from my iPad Air using Tapatalk
.
Sent from my iPad Air using Tapatalk
??:D
Daniels118
21-11-2014, 15:11
Non credo che il pattern '^(|1)' sia sintatticamente corretto, stai chiedendo di identificare una stringa che inizia con "1" oppure con boh, il che non ha alcun senso, deve esserci sempre un espressione a sinistra del carattere "|".
Non credo che il pattern '^(|1)' sia sintatticamente corretto, stai chiedendo di identificare una stringa che inizia con "1" oppure con boh, il che non ha alcun senso, deve esserci sempre un espressione a sinistra del carattere "|".
allora questo cosa vuol dire ?
ls -pR | egrep -v '(^(|\..*:)|/)$'
Daniels118
21-11-2014, 15:47
Mi correggo, ha perfettamente senso, se non c'è nulla vuol dire che deve identificare una stringa vuota.
Tornando alla tua domanda quindi:
'^(|1)' prende tutte le righe vuote o che cominciano con "1"
'^(.|1)' prende tutte le righe che cominciano con un qualunque carattere o con "1" (che è una condizione superflua)
The_ouroboros
21-11-2014, 15:51
Mi correggo, ha perfettamente senso, se non c'è nulla vuol dire che deve identificare una stringa vuota.
Tornando alla tua domanda quindi:
'^(|1)' prende tutte le righe vuote o che cominciano con "1"
'^(.|1)' prende tutte le righe che cominciano con un qualunque carattere o con "1" (che è una condizione superflua)
Infatti con .* prendi 0 o più caratteri (con .? 1 o più)
Mi correggo, ha perfettamente senso, se non c'è nulla vuol dire che deve identificare una stringa vuota.
Tornando alla tua domanda quindi:
'^(|1)' prende tutte le righe vuote o che cominciano con "1"
'^(.|1)' prende tutte le righe che cominciano con un qualunque carattere o con "1" (che è una condizione superflua)
ok grazie adesso è chiaro:)
SnakePlissken
22-11-2014, 09:37
'^(|1)' prende tutte le righe vuote o che cominciano con "1"
Non mi risulta: '^(|1)' prende tutte le righe.
^ prendi l'inizio della stringa
(|1) prendi niente oppure prendi '1'
# echo "ciccio" | grep -P '^(|1)'
ciccio
In questo caso prende prima l'inizio della stringa e poi niente (in pratica non consuma nessun carattere, e lo si può vedere aggiungendo l'opzione -o a grep). Se (in altri contesti) cattura solo righe vuote è perché ci sono impliciti ^ e $.
Daniels118
22-11-2014, 10:12
Mi sa che hai ragione, sono un po' arrugginito, mi serve un bel ripasso.
Non mi risulta: '^(|1)' prende tutte le righe.
^ prendi l'inizio della stringa
(|1) prendi niente oppure prendi '1'
# echo "ciccio" | grep -P '^(|1)'
ciccio
In questo caso prende prima l'inizio della stringa e poi niente (in pratica non consuma nessun carattere, e lo si può vedere aggiungendo l'opzione -o a grep). Se (in altri contesti) cattura solo righe vuote è perché ci sono impliciti ^ e $.
si ma tu hai usato le regex di Perl...
SnakePlissken
22-11-2014, 18:47
si ma tu hai usato le regex di Perl...
Non ti far confondere dalla -P, quell'espressione vale nell'implementazione Perl, .NET, Javascript... L'unica differenza in questo caso è che senza -P devi fare l'escape dei caratteri speciali:
# echo "ciccio" | grep '^\(\|1\)'
ciccio
Così ti torna? ;)
Non ti far confondere dalla -P, quell'espressione vale nell'implementazione Perl, .NET, Javascript... L'unica differenza in questo caso è che senza -P devi fare l'escape dei caratteri speciali:
# echo "ciccio" | grep '^\(\|1\)'
ciccio
Così ti torna? ;)
sarà la stanchezza , ma mi sto confondendo :
io leggo ;greppa o stringa vuota o stringa che comincia con 1.Perchè mi stampa "ciccio"?
Daniels118
23-11-2014, 10:11
Perché non è corretto "greppa o stringa vuota o stringa che comincia con 1", ma tutte le stringhe che cominciano con una stringa vuota (e prima di qualunque stringa possiamo immaginare che ci sia una stringa vuota), e tutte quelle che cominciano con "1". La seconda condizione è inclusa nella prima, quindi l'espressione da riscontro per qualunque stringa.
Se invece l'espressione fosse stata '^(|1.*)$', oppure '^($|1)', sarebbe stata corretta la prima affermazione.
Perché non è corretto "greppa o stringa vuota o stringa che comincia con 1", ma tutte le stringhe che cominciano con una stringa vuota (e prima di qualunque stringa possiamo immaginare che ci sia una stringa vuota), e tutte quelle che cominciano con "1". La seconda condizione è inclusa nella prima, quindi l'espressione da riscontro per qualunque stringa.
Se invece l'espressione fosse stata '^(|1.*)$', oppure '^($|1)', sarebbe stata corretta la prima affermazione.
scusa , ma quello è un or logico non un and !
dovrebbe essere
"tutte le stringhe che cominciano con una stringa vuota (e prima di qualunque stringa possiamo immaginare che ci sia una stringa vuota), o tutte quelle che cominciano con "1"."
wingman87
23-11-2014, 15:43
Sì è un or ma quello che stava puntualizzando Daniels è che "la stringa comincia con stringa vuota" non "la stringa è vuota".
Sì è un or ma quello che stava puntualizzando Daniels è che "la stringa comincia con stringa vuota" non "la stringa è vuota".
cosa cambia? in linea teorica tutte le stringhe cominciano con stringa vuota?
wingman87
23-11-2014, 20:41
Sì perché la stringa vuota è una stringa di zero caratteri
The_ouroboros
23-11-2014, 20:56
Sì perché la stringa vuota è una stringa di zero caratteri
Se è vuoto e non hai nulla come indichi il nulla? Con il nulla :D
Daniels118
24-11-2014, 07:51
Ho usato "e" per congiungere gli elementi inclusi nell'elenco, non per tradurre letteralmente la condizione.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.