Dai documenti https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF sembra che regexp_extract() sia un'estrazione record/riga dei dati che si desidera estrarre.
Sembra funzionare su un primo trovato (quindi chiuso) rispetto al globale. Pertanto l'indice fa riferimento al gruppo di cattura.
0 = tutto il match
1 = gruppo di cattura 1
2 = gruppo di cattura 2, ecc ...
parafrasato dal manuale:
regexp_extract('foothebar', 'foo(.*?)(bar)', 2)
^^
groups 1 2
This returns 'bar'.
Quindi, nel tuo caso, per ottenere il testo dopo il punto, qualcosa di simile potrebbe funzionare:
regexp_extract(name, '\.([^.]+)', 1)
o questo
regexp_extract(name, '[.]([^.]+)', 1)
modificare
ho preso nuovamente interessato a questo, solo un Cordiali saluti, ci potrebbe essere una scorciatoia/soluzione per voi.
Sembra che tu voglia un segmento particolare separato con un punto .
carattere, che è quasi come diviso.
È più che probabile che il motore regex utilizzato sovrascriva un gruppo se è stato quantificato più di una volta.
Si può approfittare di questo con qualcosa di simile:
Restituisce il primo segmento: abc
.def.ghi
regexp_extract(name, '^(?:([^.]+)\.?){1}', 1)
Restituisce il secondo segmento: abc. def
.ghi
regexp_extract(name, '^(?:([^.]+)\.?){2}', 1)
Restituisce il terzo segmento: abc.def. ghi
regexp_extract(name, '^(?:([^.]+)\.?){3}', 1)
L'indice non cambia (perché l'indice referrs ancora a catturare gruppo 1), solo le espressioni regolari cambiamenti ripetizione.
Alcune note:
Questa espressione regolare ^(?:([^.]+)\.?){n}
ha problemi però.
Richiede che ci sia qualcosa tra i punti nel segmento o che la regex non corrisponda a ...
.
Potrebbe essere questo ^(?:([^.]*)\.?){n}
ma corrisponderà anche se non è inferiore a n-1, punti
inclusa la stringa vuota. Questo probabilmente non è desiderabile.
C'è un modo per farlo dove non richiede il testo tra i punti, ma richiede comunque almeno n-1 punti.
Questo utilizza un'asserzione lookahead e il buffer di cattura 2 come flag.
^(?:(?!\2)([^.]*)(?:\.|$())){2}
, tutto il resto è lo stesso.
Quindi, se utilizza regex in stile java, dovrebbe funzionare.
regexp_extract(name, '^(?:(?!\2)([^.]*)(?:\.|$())){2}', 1)
cambia {2} in qualunque 'segmento' è necessario (questo è il segmento 2).
e restituisce ancora il buffer di acquisizione 1 dopo l'iterazione di {N}.
Qui è suddiviso
^ # Begining of string
(?: # Grouping
(?!\2) # Assertion: Capture buffer 2 is UNDEFINED
([^.]*) # Capture buffer 1, optional non-dot chars, many times
(?: # Grouping
\. # Dot character
| # or,
$() # End of string, set capture buffer 2 DEFINED (prevents recursion when end of string)
) # End grouping
){3} # End grouping, repeat group exactly 3 (or N) times (overwrites capture buffer 1 each time)
Se non lo fa affermazioni, allora questo non funzionerà!
grazie, era così. tempo di presentare una richiesta di funzionalità con l'alveare :-) – Mario
@ Mario - Il benvenuto. Aggiunta la possibile regex di soluzione alternativa per accorciare le cose come soluzione. – sln
vorrei poterti votare una seconda volta – Mario