2010-07-19 14 views
6

utilisant porc apache et le texteRegexp chez le porc correspondant

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

Je suis en train de faire correspondre « mon frère juste na pas faire quelque chose de mal. »

Idéalement, je voudrais faire correspondre n'importe quoi commençant par «mon frère juste» et finir avec la ponctuation (fin de phrase) ou EOL.

En regardant les docs de porc, puis en suivant le lien vers java.util.regex.Pattern, je me dis que je devrais pouvoir utiliser

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

Mais cela semble correspondre jusqu'à la fin de la ligne . Des suggestions pour effectuer ce match? Je suis prêt à tirer mes cheveux, et en tirer mes cheveux, je veux dire passer en python de streaming

Répondre

4

Par défaut, les quantificateurs sont greedy. Cela signifie qu'ils correspondent autant que possible. Dans ce cas, vous ne pouvez faire correspondre que le premier signe de ponctuation. En d'autres termes, vous voulez correspondre le moins possible.

Donc, pour résoudre votre problème, vous devez faire le quanitifer non gourmand en ajoutant un ? immédiatement après:

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

Notez que l'utilisation de ? ici est différent de son utilisation comme quantificateur où cela signifie ' correspondre à zéro ou un '.

+0

-vous nous expliquer la partie gourmande? Je pensais que je ferais juste correspondre le mot juste, n'importe quel texte suivant, jusqu'à la première instance de la ponctuation. –

+0

Sans être non gourmand, il ne correspond pas à la première instance de ponctuation, il correspond plutôt à celui de _last_ un. – Wrikken

+0

@Neil Kodner: J'ai mis à jour la réponse. –

0

Avez-vous essayé: .*(my brother just .*\\p{Punct})

Il semble que votre expression voulait que la partie my brother être le début de la chaîne, mais dans votre exemple, elle est au milieu de la chaîne, donc vous devez prendre en compte tout avant my brother.