Postgres - 如何拆分和加入?

时间:2013-07-27 01:15:37

标签: regex postgresql

有没有办法将列拆分为标记,并加入它们(就像在其他编程语言中一样,如Python,Java,Ruby)

我有一个包含“http://www.Yahoo.com”等网址的列,我想从中提取“Yahoo.com”(主域名,而不是子域名)。网址可以是以下形式:

我打算使用正则表达式在http://之后和下一个斜杠之前提取所有内容。然后将句点分割为句点(。),然后加入最后2个标记。

使用正则表达式,我可以从http://www.yahoo.com中提取www.yahoo.com。通过分组/连接,我可以从www.yahoo.com获得yahoo.com。问题是我不知道如何与Postgres进行拆分/连接。

有人知道吗?还是更好的选择?

3 个答案:

答案 0 :(得分:3)

这不是你要求的方法,但应该得到你想要的东西:

vinod=# select * from table;
            url                
----------------------------------
 http://www.domain.com
 http://domain.com
 http://domain.com/page/page1
 http://www.domain.com/page/page2
 http://www.domain.com/
(5 rows)

vinod=# select substring(substring(url from 'http[s]*://([^/]+)') from '\w+\.\w+$') from table;
 substring  
------------
 domain.com
 domain.com
 domain.com
 domain.com
 domain.com
(5 rows)

内部substring命令拉出完整域,外部substring命令拉出最后两个片段。 Postgresql拆分和连接命令没有普通脚本语言那么强大,所以我倾向于在把数据从数据库中拉出来之后做这种事情,如果可以的话。

答案 1 :(得分:0)

您可以将它们与\w+.[^.]+$

匹配
http://www.domain.com -> domain.com
http://domain.com -> domain.com
http://domain.com/page/page1 -> domain.com/page/page1
http://www.domain.com/ -> domain.com/
http://www.domain.com/page/page2 -> domain.com/page/page2

答案 2 :(得分:0)

将事物拆分成令牌可以通过以下几种方式完成:

  • regexp_split_to_table / regexp_split_to_array
  • string_to_array(对于简单的固定分隔符拆分)
  • 手动substring提取或substring(... from 'pattern')
  • 全文搜索to_tsvectorto_tsquery
  • 程序语言库,如Perl或Python URL库,用于自然语言处理的Python + NLTK等

在这种情况下,您可以使用regexp_split_....使用正则表达式进行URL拆分,这可能适用于许多用途 - 但可能不是这个。考虑:

  • 我的域名ringerc.id.au 是“主要”域名)
  • www.ecu.edu.au(“主要”域名为ecu.edu.au
  • www.transperth.wa.gov.au(“主要”域名为transperth.wa.gov.au
  • tartarus.uwa.edu.au(“主要”域名为uwa.edu.au

祝你好运使用正则表达式处理所有国家注册局和子注册表变体。使用正确的URL解析器来提取域,然后使用适当的域感知库来确定“主”域的用途。我建议使用plperl和the URL::SplitURI模块开始。或者你想要的任何支持的过程语言(Python,TCL,等等)的URL解析器。然后为该语言找到一个合适的库,可以根据您想要的标准有意义地识别域和子域,并使用它,而不仅仅依赖于正则表达式。

加入时你同样有很多选择:

  • array_to_string
  • string_agg
  • ||连接运算符
  • 程序语言字符串操作和库

对于URL工作,我建议再次使用具有适当本机URL库的PL。