猪中的正则表达式匹配
Posted
技术标签:
【中文标题】猪中的正则表达式匹配【英文标题】:Regexp matching in pig 【发布时间】:2010-07-19 21:03:44 【问题描述】:使用 apache pig 和文本
hahahah. my brother just didnt do anything wrong. He cheated on a test? no way!
我正在尝试匹配“我的兄弟只是没有做错任何事。”
理想情况下,我希望匹配以“my brother just”开头并以标点符号(句末)或 EOL 结尾的任何内容。
查看 pig 文档,然后点击 java.util.regex.Pattern 的链接,我想我应该可以使用
extrctd = FOREACH fltr GENERATE FLATTEN(EXTRACT(txt,'(my brother just .*\\pPunct)')) as (txt:chararray);
但这似乎匹配到行尾。对进行这场比赛有什么建议吗?我已经准备好拔头发了,拔头发的意思是切换到 python 流媒体
【问题讨论】:
【参考方案1】:默认量词是greedy。这意味着它们尽可能匹配。在这种情况下,您只想匹配到第一个标点符号。换句话说,您希望尽可能少地匹配。
因此,要解决您的问题,您应该通过在其后立即添加 ?
来使 quanitifer 不贪心:
请注意,此处使用?
与用作量词不同,后者表示“匹配零或一”。
【讨论】:
您介意解释一下贪婪的部分吗?我想我只会匹配单词 just、任何后续文本,直到第一个标点符号。 如果没有非贪婪,它不会匹配到标点符号的第一个实例,而是匹配到最后一个。 如果没有标点符号怎么办?如果没有标点符号,我希望它匹配到句末或 EOL。 更直观的答案可能是匹配“我的兄弟只是”之后的所有内容而不是标点符号,然后匹配标点符号。这样,“不是标点符号”部分将匹配每个单词/空格并在第一个标点符号处停止。【参考方案2】:你试过了吗:.*(my brother just .*\\pPunct)
看起来您的表达式希望 my brother
部分成为字符串的开头,但在您的示例中,它位于字符串的中间,因此您必须考虑 my brother
之前的所有内容。
【讨论】:
【参考方案3】:您正在匹配 .* 这就是...一切...尝试 [az]* 仅匹配字母
【讨论】:
以上是关于猪中的正则表达式匹配的主要内容,如果未能解决你的问题,请参考以下文章