Hadoop Pig Latin正则表达式匹配

时间:2012-10-27 16:45:51

标签: regex apache-pig

我有以下Pig Latin过滤器:

filtered = FILTER raw BY year >= 1960 AND string MATCHES '(?!.*[0-9].*|.{1}|.*@.*|.*www.*|.*http.*)';

我打算为以下字符串获取以下结果:

a #false .{1}
email@example.com #false .*@.*
http://somesite.com #false .*http.*
www.somesite.com #false .*www.*
12word #false .*[0-9].*
wo12rd #false .*[0-9].*
word12 #false .*[0-9].*
red #true

相反,我得到一个空的结果集。

编辑: 我已将正则表达式更新为:

'^(?!.*[0-9].*|.{1}|.*@.*|.*www.*|.*http.*)$'

在m.buettner的修正之后,但继续得到一个空的结果集。

1 个答案:

答案 0 :(得分:1)

有两个问题。首先,看起来Pig Latin要求你匹配完整的字符串而不是“只是在字符串中的某个匹配”。但是你的负向前瞻不会消耗任何字符,因此它与字符串的完全匹配。这可以通过附加.*来解决。其次,您的规则.{1}(其中{1}是多余的)不要求这一个字符是字符串中唯一的字符。所以在你的上一个例子中,它只会消耗r的{​​{1}}并引发否定前瞻。

因此,这是解决方案:

red