我需要删除“括号”中的第三个及后续值。用户代理字符串的组件。
为了获得
Mozilla / 4.0(兼容; MSIE 8.0)
这
Mozilla / 4.0(兼容; MSIE 8.0; Windows NT 6.0; Trident / 4.0; GTB6; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; WinTSI 06.12.2009; .NET CLR 3.0.30729; .NET4.0C)
我成功使用了sed命令
sed 's/(\([^;]\+; [^;]\+\)[^)]*)/(\1)/'
我需要在Apache Pig中使用Java正则表达式获得相同的结果。 有人可以帮我把上面的sed正则表达式重写成Java吗?
类似的东西:
new = FOREACH userAgent GENERATE FLATTEN(EXTRACT(userAgent, 'JAVA REGEX?') as (term:chararray);
答案 0 :(得分:2)
我不使用Pig,但浏览文档会显示一个包含Java replaceAll()
方法的REPLACE函数。试试这个:
REPLACE(userAgent, '\(([^;]+; [^;]+)[^)]*\)', '($1)')
它应匹配UserAgent字符串的整个带括号的部分,并用前两个以分号分隔的术语替换其内容,就像你的sed命令一样。
答案 1 :(得分:1)
在java中,如果使用Matcher类,则可以提取捕获组。以下似乎可以满足您的需求,至少对于您提供的测试用例而言。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args){
String str = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; GTB6; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; WinTSI 06.12.2009; .NET CLR 3.0.30729; .NET4.0C)";
//str = "aaa";
Pattern pat = Pattern.compile("(.*\\(.*?;.*?;).*\\)");
Matcher m = pat.matcher(str);
System.out.println(m.lookingAt());
String group = m.group(1) + ")";
System.out.println(group);
}
}
嗯......我好像回答了错误的问题,因为你问的是如何从'PIG'而不是直接的JAVA那里做到这一点。
答案 2 :(得分:0)
由于两个建议的解决方案似乎都不适用于PIG,我将发布使用sed到流的解决方法:
user_agent_mangled = STREAM logs THROUGH `sed 's/(\\([^;]\\+; [^;]\\+\\)[^)]*)/(\\1)/'`;
这很好用,但我仍然更喜欢原生PIG解决方案(使用EXTRACT或REPLACE功能)。