使用正则表达式在perl中提取前两个单词

时间:2015-02-25 07:30:19

标签: regex perl function postgresql-9.1

我想使用PostgreSQL中的Perl函数从句子中创建前两个单词。在PostgreSQL中,我可以这样做:

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

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

它会回归"我是"

我试图在Postgresql中构建一个Perl函数来做同样的事情。

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;

但是我在正则表达式附近收到语法错误。我不确定我做错了什么。

2 个答案:

答案 0 :(得分:1)

即使在英语中,提取单词也是微不足道的。使用Locale::CLDR

获取以下设计示例
use 'Locale::CLDR';
my $locale = Locale::CLDR->new('en');
my @words = $locale->split_words('adf543. 123.25');

@words现在包含

  • adf543
  • 123.25

请注意,adf543之后的句号会被拆分为单独的单词,但12325之间的句号会保留为123.25的一部分,即使''是同一个字符

如果你看非英语语言会变得更糟,而当你使用非拉丁文字时会更糟。

您需要精确定义您认为某个单词的内容,否则以下法语会被错误地拆分。

  

Je avais dit«Elle a dit«Il a dit«Ni»il ya trois secondes»»

答案 1 :(得分:0)

括号在我们的正则表达式模式中不匹配。它有三个开括号和四个结束括号。

另外,在单引号字符串的中间有两个单引号,所以

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

被解析为两个单独的字符串

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

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

但我不能建议如何修复它,因为我不明白你的意图。

你的意思是双引号吗?在这种情况下,(!|,|\&|")?可以写为[!,&"]?


<强>更新

粗略猜测我认为你想要这个

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

但我无法确定。如果你用英语描述你正在寻找什么,那么我可以帮助你更好。例如,目前还不清楚为什么你在标点符号列表中没有问号,句号和分号。