Apache Pig - 具有多个匹配条件的 MATCHES

Posted

技术标签:

【中文标题】Apache Pig - 具有多个匹配条件的 MATCHES【英文标题】:Apache Pig - MATCHES with multiple match criteria 【发布时间】:2013-09-01 11:22:42 【问题描述】:

我正在尝试采用逻辑匹配标准,例如:

(("Foo" OR "Foo Bar" OR FooBar) AND ("test" OR "testA" OR "TestB")) OR TestZ

并将其应用为与 pig 中的文件的匹配项

result = filter inputfields by text matches (some regex expression here));

问题是我不知道如何将上面的逻辑表达式转换为匹配方法的正则表达式。

我摆弄了各种各样的东西,我最接近的是这样的:

((?=.*?\bFoo\b | \bFoo Bar\b))(?=.*?\bTestZ\b)

有什么想法吗?如果可能,我还需要尝试以编程方式进行此转换。

一些例子:

a - 快速的棕色 Foo 跳过了惰性测试(这应该通过,因为它包含 foo 和 test)

b - TestZ 中发生的事情(这也通过了,因为它包含 testZ)

c - 快速的棕色 Foo 跳过了懒狗(这应该会失败,因为它包含 Foo 但不包含 test、testA 或 TestB)

谢谢

【问题讨论】:

对于老鹰眼,“OR TestZ”之前缺少一个“)”。请忽略这个错字。谢谢 如果这个错字不是故意的,您可以使用问题下方的 [edit] 选项更正它,而不是通知其他人 :) 我对如何编写你的正则表达式几乎没有什么想法,但它的形式取决于你的输入和你期望的结果。现在我不确定test 是否在foo bar 部分之后是强制性的。如果是这样,它也应该包含在匹配中(您正在使用前瞻 (?=...) 所以可能不是)。另外你是说OR TestZ之前应该有),那么TestZ对单场比赛就足够了吗? 嗨,正如您正确指出的那样,我可以编辑它......所以我现在添加了括号。我们实际上在 inputfields 文件中有一个句子列表(在字段文本中)。我正在寻找符合条件的文本 您的示例中的 AND 运算符是什么意思?文本不能同时匹配“Foo”和“test” - 还是应该匹配“Foo test”?您能否发布几个输入数据示例以及您想要匹配的示例? 【参考方案1】:

由于您使用的是 Pig,您实际上不需要涉及正则表达式,您可以使用 pig 提供的布尔运算符结合几个简单的正则表达式,例如:

T = load 'matches.txt' as (str:chararray);
F = filter T by ((str matches '.*(Foo|Foo Bar|FooBar).*' and str matches '.*(test|testA|TestB).*') or str matches '.*TestZ.*');
dump F;

【讨论】:

【参考方案2】:

您可以将此正则表达式用于matches 方法

^((?=.*\\bTestZ\\b)|(?=.*\\b(FooBar|Foo Bar|Foo)\\b)(?=.*\\b(testA|testB|test)\\b)).*
注意"Foo" OR "Foo Bar" OR "FooBar"应该写成FooBar|Foo Bar|Foo而不是Foo|Foo Bar|FooBar,以防止在包含FooBarFoo Bar的字符串中只匹配Foo 另外,由于前瞻是零宽度,您需要在正则表达式末尾传递 .* 以让匹配匹配整个字符串。

演示

String[] data =  "The quick brown Foo jumped over the lazy test",
        "the was something going on in TestZ",
        "the quick brown Foo jumped over the lazy dog" ;
String regex = "^((?=.*\\bTestZ\\b)|(?=.*\\b(FooBar|Foo Bar|Foo)\\b)(?=.*\\b(testA|testB|test)\\b)).*";
for (String s : data) 
    System.out.println(s.matches(regex) + " : " + s);

输出:

true : The quick brown Foo jumped over the lazy test
true : the was something going on in TestZ
false : the quick brown Foo jumped over the lazy dog

【讨论】:

非常感谢...我会解决这个问题...以及猪猪的建议

以上是关于Apache Pig - 具有多个匹配条件的 MATCHES的主要内容,如果未能解决你的问题,请参考以下文章

无法将 org.apache.pig.builtin.SUM 的匹配函数推断为多个匹配或都不匹配。请使用显式演员表

Apache Pig - 如何获取多个包之间的匹配元素数量?

具有多个分隔符的 apache pig 加载数据

如果存在多个值,Apache Pig Group by 和过滤器?

使用 pig 生成最大数量

Apache pig Store 基于条件