2010-03-24 14 views
7

Utilizzando rubino regexp ottengo i seguenti risultati:Ruby Regexp: + vs *. comportamento speciale?

>> 'foobar'[/o+/] 
=> "oo" 
>> 'foobar'[/o*/] 
=> "" 

Ma:

>> 'foobar'[/fo+/] 
=> "foo" 
>> 'foobar'[/fo*/] 
=> "foo" 

La documentazione afferma:
*: zero o più ripetizioni della precedente
+: una o più ripetizioni del precedente

Quindi mi aspetto che 'foobar' [/ o * /] restituisca lo stesso risultato di 'foobar' [/ o + /]

qualcuno ha una spiegazione che

risposta

14

'foobar'[/o*/] viene corrispondenza dello zero o s visualizzate prima del f, alla posizione 0
'foobar'[/o+/] non può corrispondere lì perché ci deve essere almeno 1 o, quindi corrisponde invece tutti i o s dalla posizione 1

In particolare, le partite che si vedono sono

'foobar'[/o*/]=>'<>foobar'
'foobar'[/o+/]=>'f<oo>bar'

3

Questo è un equivoco comune di opere come regexp.

Anche se il * è avido e non è ancorato all'inizio della stringa, il motore regexp sarà ancora iniziare la ricerca dall'inizio della stringa. Nel caso di "/ o + /", non corrisponde alla posizione 0 (ad es. "F"), ma poiché + indica uno o più, deve continuare la corrispondenza (questo non ha nulla a che fare con l'avidità) fino a quando la corrispondenza è stata trovata o tutte le posizioni sono state valutate.

Tuttavia con il caso di "/ o * /", che come sapete significa 0 o più volte, quando non corrisponde alla posizione 0, il motore regexp si arresta con garbo in quel punto (come dovrebbe, perché o * significa semplicemente che la o è opzionale). Ci sono anche motivi di prestazioni, dal momento che "o" è opzionale, perché dedicare più tempo a cercarlo?