Java или Pig регулярное выражение для удаления значений из строки UserAgent - PullRequest
2 голосов
/ 23 ноября 2011

Мне нужно вычеркнуть третье и последующие значения в компоненте «в скобках» строки пользовательского агента.

Чтобы получить

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);

Ответы [ 3 ]

2 голосов
/ 23 ноября 2011

Я не использую Pig, но при просмотре документов обнаруживается функция REPLACE, которая обертывает метод Java replaceAll().Попробуйте это:

REPLACE(userAgent, '\(([^;]+; [^;]+)[^)]*\)', '($1)')

Это должно соответствовать целой части строки UserAgent, заключенной в скобки, и заменить ее содержимое только первыми двумя терминами, разделенными точкой с запятой, как это делает ваша команда sed.

1 голос
/ 23 ноября 2011

В 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);
    }
 }

Хмм ... Я, кажется, ответил на неправильный вопрос, поскольку вы спрашивали, как это сделать изСвинья не прямо JAVA.

0 голосов
/ 24 ноября 2011

Поскольку ни одно из двух предложенных решений, похоже, не работает в PIG, я опубликую обходной путь, который использует sed через stream:

user_agent_mangled = STREAM logs THROUGH `sed 's/(\\([^;]\\+; [^;]\\+\\)[^)]*)/(\\1)/'`;

Это работает хорошо, однако я все же предпочел бы собственное решение для PIG (используя функцию EXTRACT или REPLACE).

...