猪的正则表达式匹配

时间:2010-07-19 21:03:45

标签: regex hadoop apache-pig

使用apache pig和文本

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

我正在努力匹配“我哥哥刚才做错了什么。”

理想情况下,我想匹配以“我的兄弟”开头的任何内容,并以标点符号(句末)或EOL结束。

查看猪文档,然后按照java.util.regex.Pattern的链接,我想我应该可以使用

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

但这似乎匹配到行尾。有关执行此匹配的任何建议吗?我已经准备好把头发拉出来了,把头发拉出来,我的意思是转换成python流式传输

3 个答案:

答案 0 :(得分:4)

默认情况下,量词是greedy。这意味着它们尽可能匹配。在这种情况下,您只想匹配第一个标点符号。换句话说,你想尽可能少地匹配。

因此,为了解决您的问题,您应该立即在?之后添加?,以使quanitifer非贪婪:

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

请注意,此处{{1}}的使用与量词的使用不同,即“匹配零或一”。

答案 1 :(得分:0)

您是否尝试过:.*(my brother just .*\\p{Punct})

看起来你的表达式希望my brother部分是字符串的开头,但在你的例子中,它位于字符串的中间,所以你必须考虑my brother之前的所有内容。< / p>

答案 2 :(得分:0)

你正在匹配。*这就是......所有......尝试[az] *来匹配字母