我正在尝试采用逻辑匹配标准,如:
(("Foo" OR "Foo Bar" OR FooBar) AND ("test" OR "testA" OR "TestB")) OR TestZ
并使用
将其作为匹配猪的文件result = filter inputfields by text matches (some regex expression here));
问题是我不知道如何将上面的逻辑表达式转换为匹配方法的正则表达式。
我摆弄了各种各样的东西,而我最接近的就是这样:
((?=.*?\bFoo\b | \bFoo Bar\b))(?=.*?\bTestZ\b)
有什么想法吗?如果可能的话,我还需要尝试以编程方式进行此转换。
一些例子:
a - 快速的棕色Foo跳过懒惰测试(这应该通过,因为它包含foo和测试)
b - 在TestZ中发生的事情(这也包含了testZ)
c - 快速的棕色Foo跳过懒狗(这应该失败,因为它包含Foo但不测试,testA或TestB)
由于
答案 0 :(得分:12)
由于您正在使用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;
答案 1 :(得分:1)
您可以将此正则表达式用于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
,以防止仅匹配Foo
或FooBar
}的字符串中的Foo Bar
LI>
.*
以使匹配符合整个字符串。演示
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