Regex Hadoop Pig拉丁正则表达式匹配

Regex Hadoop Pig拉丁正则表达式匹配,regex,apache-pig,Regex,Apache Pig,我有以下过滤器: 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.* 12wor

我有以下过滤器:

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校正后,但继续得到一个空结果集。

有两个问题。首先,Pig Latin似乎要求您匹配整个字符串,而不是“字符串中的某个地方匹配”。但是,负前瞻不使用任何字符,因此它与字符串的完整字符不匹配。这可以通过添加
*
来解决。其次,您的规则
{1}
(其中
{1}
是冗余的)不要求这一个字符是字符串中的唯一字符。因此,在上一个示例中,它将简单地使用
r
red
,并设置负前瞻

因此,解决方案如下:

(?!.*[0-9]|.$|.*@|.*www|.*http).*

有两个问题。首先,Pig Latin似乎要求您匹配整个字符串,而不是“字符串中的某个地方匹配”。但是,负前瞻不使用任何字符,因此它与字符串的完整字符不匹配。这可以通过添加
*
来解决。其次,您的规则
{1}
(其中
{1}
是冗余的)不要求这一个字符是字符串中的唯一字符。因此,在上一个示例中,它将简单地使用
r
red
,并设置负前瞻

因此,解决方案如下:

(?!.*[0-9]|.$|.*@|.*www|.*http).*

我继续得到一个带有正则表达式“^(?!*[0-9].*.{1}.*.@.*.*www.*.*http.*.$”的空结果集。谢谢你纠正我的正则表达式-我已经学会了!但是我的问题没有解决。文档说Pig Latin希望使用Java正则表达式格式。我已经通读了这些文件,但我显然遗漏了一个关键点。@waigani你试过我的第一个建议了吗?(只需删除
(?!
?这些正则表达式是正确的Java正则表达式,但问题是它们是否使用'matches'函数(这意味着必须匹配完整字符串)。如果我删除(?!and),它将包含所有匹配。我需要排除所有匹配。啊,对。这是如何工作的:
(?!.[0-9]..$.$..*.*.
?'^.*.[0-9]...*..$..$.$.*.*.*.*.*.*.*.*.$.$.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.'.*.*.*.*.*.*不确定原因。但是删除^和$,并将其更改为。{1}.$的效果与预期一致。因此,您的上一个建议,减去^.^看起来会起作用-现在只需运行map reduce map.*.*.*.*.*.*我继续得到一个空的结果集*[0-9].*.{1}.*.*.*.*.*.*.*www.*.*http.*.$”。感谢您纠正我的正则表达式-我已经学会了!但我的问题没有解决。文档说Pig Latin需要Java正则表达式格式。我已经通读了文档,但显然遗漏了一个关键点。@waigani您尝试过我的第一个建议吗?(只是删除
(?!
?这些正则表达式是正确的Java正则表达式,但问题是它们是否使用“matches”函数(这意味着必须匹配完整的字符串)。如果我删除(?!and),它将包括所有匹配项。我需要排除所有匹配项。啊,对了。这是如何工作的:
(?!.[0-9].|.$|.@........*www.|.*http.*
?'^(?!.[0-9].*.{1}.*.@.*.*www.*.*http.*.$”匹配了所有内容,但不确定原因。但是删除“^”和“$”,并将“{1}”更改为“.$”,效果与预期一致。因此,您的上一个建议,减去“^”看起来会起作用-现在只需运行map reduce。