猪中的正则表达式匹配

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 不贪心:

我的兄弟只是 .*?\\pPunct ^

请注意,此处使用? 与用作量词不同,后者表示“匹配零或一”。

【讨论】:

您介意解释一下贪婪的部分吗?我想我只会匹配单词 just、任何后续文本,直到第一个标点符号。 如果没有非贪婪,它不会匹配到标点符号的第一个实例,而是匹配到最后一个 如果没有标点符号怎么办?如果没有标点符号,我希望它匹配到句末或 EOL。 更直观的答案可能是匹配“我的兄弟只是”之后的所有内容而不是标点符号,然后匹配标点符号。这样,“不是标点符号”部分将匹配每个单词/空格并在第一个标点符号处停止。【参考方案2】:

你试过了吗:.*(my brother just .*\\pPunct)

看起来您的表达式希望 my brother 部分成为字符串的开头,但在您的示例中,它位于字符串的中间,因此您必须考虑 my brother 之前的所有内容。

【讨论】:

【参考方案3】:

您正在匹配 .* 这就是...一切...尝试 [az]* 仅匹配字母

【讨论】:

以上是关于猪中的正则表达式匹配的主要内容,如果未能解决你的问题,请参考以下文章

JS中的正则表达式匹配

如何用正则表达式匹配括号中的内容,不包含括号

正则表达式如何匹配提取括号中的内容

Nginx中的正则如何匹配数字

如何用正则表达式匹配括号中的内容。

正则表达式大全