Соответствие регулярному выражению у свиньи - PullRequest
6 голосов
/ 20 июля 2010

Использование apache pig и текста

hahahah.  my brother just didnt do anything wrong. He cheated on a test? no way!

Я пытаюсь найти соответствие "мой брат просто не сделал ничего плохого".

В идеале я бы хотел сопоставить что-либо, начинающееся с «просто мой брат» и заканчиваться либо пунктуацией (конец предложения), либо EOL.

Глядя на документацию pig и затем переходя по ссылке на java.util.regex.Pattern, я полагаю, что смогу использовать

extrctd = FOREACH fltr GENERATE FLATTEN(EXTRACT(txt,'(my brother just .*\\p{Punct})')) as (txt:chararray);

Но это, кажется, совпадает до конца строки. Любые предложения для выполнения этого матча? Я готов вырвать мои волосы, и, потянув их за волосы, я имею в виду переключение на потоковую передачу питона

Ответы [ 3 ]

4 голосов
/ 20 июля 2010

По умолчанию квантификаторами являются жадные . Это означает, что они совпадают как можно больше. В этом случае вы хотите, чтобы соответствовать только до первого знака препинания. Другими словами, вы хотите соответствовать как можно меньше.

Таким образом, чтобы решить вашу проблему, вы должны сделать квантифер не жадным, добавив ? сразу после него:

my brother just .*?\\p{Punct}
                  ^

Обратите внимание, что использование ? здесь отличается от его использования в качестве квантификатора, где оно означает «соответствует нулю или единице».

0 голосов
/ 20 июля 2010

Вы соответствуете. * Что ... все ... попробуйте [az] *, чтобы соответствовать только букв

0 голосов
/ 20 июля 2010

Вы пробовали: .*(my brother just .*\\p{Punct})

Похоже, ваше выражение хотело, чтобы часть my brother была началом строки, но в вашем примере она находится в середине строки, поэтому вы должны учитывать все до my brother.

...