2010-07-19 19 views
6

Utilizzando maiale apache e il testoRegexp corrispondente nel maiale

hahahah. my brother just didnt do anything wrong. He cheated on a test? no way! 

che sto cercando di abbinare "il mio fratello appena fatto fare qualcosa di sbagliato."

Idealmente, vorrei abbinare qualsiasi cosa che inizia con "mio fratello solo" e finire con la punteggiatura (fine della frase) o EOL.

Guardando la documentazione di maiale, e poi seguendo il link al java.util.regex.Pattern, immagino dovrei essere in grado di utilizzare

extrctd = FOREACH fltr GENERATE FLATTEN(EXTRACT(txt,'(my brother just .*\\p{Punct})')) as (txt:chararray); 

ma che sembra corrispondere fino alla fine della linea . Qualche suggerimento per l'esecuzione di questa partita? Sono pronto a tirare fuori i miei capelli, e per estrarre i miei capelli, intendo passare a python in streaming

risposta

4

I quantificatori predefiniti sono greedy. Ciò significa che corrispondono il più possibile. In questo caso, si desidera abbinare solo fino al primo segno di punteggiatura. In altre parole, vuoi abbinare il meno possibile.

Quindi, per risolvere il problema si dovrebbe fare il quanitifer non avido con l'aggiunta di un ? subito dopo che:

 
my brother just .*?\\p{Punct} 
       ^

Si noti che l'uso di ? qui è diverso dal suo uso come un quantificatore dove significa ' corrisponde a zero o uno ".

+0

Ti dispiacerebbe spiegare la parte avidi? Ho pensato che avrei trovato solo la parola giusta, qualsiasi testo successivo, fino alla prima istanza di punteggiatura. –

+0

Senza non-greedy, non corrisponde alla prima istanza di punteggiatura, ma corrisponde a quella _last_. – Wrikken

+0

@Neil Kodner: ho aggiornato la risposta. –

0

Hai provato: .*(my brother just .*\\p{Punct})

Sembra che la tua espressione voleva la parte my brother di essere l'inizio di la stringa, ma nell'esempio si trova nel mezzo della stringa, quindi è necessario tenere conto di tutto prima dello my brother.