我想使用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;
但是我在正则表达式附近收到语法错误。我不确定我做错了什么。
答案 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
之间的句号会保留为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)/;
但我无法确定。如果你用英语描述你正在寻找什么,那么我可以帮助你更好。例如,目前还不清楚为什么你在标点符号列表中没有问号,句号和分号。