PDA

View Full Version : regex pipe (|)


candela
20-05-2013, 08: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, 09:29
^(999|[0-9][0-9]|100)$

candela
20-05-2013, 13: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, 13: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, 13:46
puoi provarle "live" qui cmq: http://regexpal.com/

toni00t
21-11-2014, 15: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, 15:25
.


Sent from my iPad Air using Tapatalk

toni00t
21-11-2014, 16:03
.


Sent from my iPad Air using Tapatalk
??:D

Daniels118
21-11-2014, 16: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, 16: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, 16: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, 16: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, 17: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, 10: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, 11:12
Mi sa che hai ragione, sono un po' arrugginito, mi serve un bel ripasso.

toni00t
22-11-2014, 16: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, 19: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, 20: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, 11: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, 16: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, 16: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, 21: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, 21:41
Sì perché la stringa vuota è una stringa di zero caratteri

The_ouroboros
23-11-2014, 21: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, 08:51
Ho usato "e" per congiungere gli elementi inclusi nell'elenco, non per tradurre letteralmente la condizione.

Hardware Upgrade Forum Database Error
Database Error Database error
The Hardware Upgrade Forum database has encountered a problem.

Please try the following:
  • Load the page again by clicking the Refresh button in your web browser.
  • Open the www.hwupgrade.it home page, then try to open another page.
  • Click the Back button to try another link.
The www.hwupgrade.it forum technical staff have been notified of the error, though you may contact them if the problem persists.
 
We apologise for any inconvenience.