2015-02-25 2 views
0

Я хочу создать из первых двух слов из предложения, используя Perl-функцию в PostgreSQL. В PostgreSQL, я могу сделать это с помощью:Извлечение первых двух слов в perl с использованием regex

text = "I am trying to make this work"; 

Select substring(text from '(^\w+-\w+|^\w+(\s+)?(!|,|\&|'')?(\s+)?\w+)'); 

Он вернется "I Am"

Я пытался построить функцию Perl в Postgresql, что делает то же самое.

CREATE OR REPLACE FUNCTION extract_first_two (text) 
    RETURNS text AS 
    $$ 
    my $my_text = $_[0]; 
    my $temp; 

    $pattern = '^\w+-\w+|^\w+(\s+)?(!|,|\&|'')?(\s+)?\w+)'; 
    my $regex = qr/$pattern/; 
    if ($my_text=~ $regex) { 
    $temp = $1; 
    } 

    return $temp; 
    $$ LANGUAGE plperl; 

Но я получаю синтаксическую ошибку рядом с регулярным выражением. Я не уверен, что я делаю неправильно.

+0

I Пробовал if ($ my_text = ~ qr/^ \ w + - \ w + |^\ w + (\ s +)? (! |, | \ & | '')? (\ S +)? \ W + /) {---- - Но я получаю пустой результат. – samuraiexe

+0

Только гадание, но вы не объявили '$ pattern'. – collapsar

ответ

0

Круглые скобки не совпадают в нашем шаблоне регулярных выражений. Он имеет три открывающиеся круглые скобки и четыре закрывающие.

Кроме того, у вас есть две одинарные кавычки в середине однократных строки в кавычках, так что

'^\w+-\w+|^\w+(\s+)?(!|,|\&|'')?(\s+)?\w+)' 

обрабатывается как два отдельных строк

'^\w+-\w+|^\w+(\s+)?(!|,|\&|'')?(\s+)?\w+)' 

и

'^\w+-\w+|^\w+(\s+)?(!|,|\&|' 
')?(\s+)?\w+)' 

Но я не могу предложить, как это исправить, поскольку я не понимаю ваших намерений.

Возможно, вы имели в виду двойную цитату? В этом случае (!|,|\&|")? можно записать в виде [!,&"]?


Update

По предварительным оценкам, я думаю, что вы хотите, это

my $regex = qr{^\w++ \s* [-!,&"]* \s* \w+ }x; 
$temp = $1 if $my_text=~ /($regex)/; 

, но я не могу быть уверен. Если вы опишете то, что ищете на английском, я могу помочь вам лучше. Например, непонятно, почему у вас нет вопросительных знаков, полных остановок и точек с запятой в списке промежуточных знаков препинания.

0

Извлечение слов не является тривиальным даже на английском языке. Рассмотрим следующий пример надуманный с помощью Locale :: CLDR

use 'Locale::CLDR'; 
my $locale = Locale::CLDR->new('en'); 
my @words = $locale->split_words('adf543. 123.25'); 

@words теперь содержит

  • adf543
  • .
  • 123,25

Обратите внимание, что полная остановка после adf543 разделяется на отдельное слово, но один между 123 и 25 сохраняется как часть числа 123.25, даже несмотря на то, «» тот же символ

Если ухудшается ситуация, когда вы смотрите на неанглийские языки и намного хуже, когда используете нелатинские скрипты.

Вы должны точно определить, что вы думаете, что слово в противном случае следующие французский разбиваются неправильно

Je avais ДИТ «Elle дита«Il дит «Ni» иль я труа secondes»»

Смежные вопросы