PDA

View Full Version : regex pipe (|)


candela
20-05-2013, 07:34
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)$

candela
20-05-2013, 12:30
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/

toni00t
21-11-2014, 14:20
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

toni00t
21-11-2014, 15:03
.


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 "|".

toni00t
21-11-2014, 15:21
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ù)

toni00t
21-11-2014, 16:09
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.

toni00t
22-11-2014, 15:17
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? ;)

toni00t
22-11-2014, 19:12
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.

toni00t
23-11-2014, 15:17
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".

toni00t
23-11-2014, 20:25
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.