如何从字符串中获取部分String

时间:2012-07-24 21:24:13

标签: sql postgresql substring

如何在/.html

之间提取数值
http://www.site.com/prod/bunch-of-seo-text-of-different-length/12345687.html
http://www.site.com/prod/bunch-of-seo-text-of-different-length/12345688.html
http://www.site.com/prod/bunch-of-seo-text-of-different-length/12345688.html

我试过这个,但我不知道语法

SUBSTRING(link FROM '%/%' FOR '%.html%') 

4 个答案:

答案 0 :(得分:2)

问题是:

  

如何在/和.html之间提取数值?

正确答案是:

SELECT substring(link, '/(\d+)\.html')

\d .. [[:digit:]]的班级简写,相当于[0-9]
 + ..前述原子中的一个或多个 () ..括号捕获比赛
\. .. dot必须被转义才能失去其特殊含义

测试:

WITH x(link) AS (
    VALUES
     ('http://www.site.com/prod/bunch-of-text-of-different-length/12345687.html')
    ,('http://www.site.com/prod/bunch-of-text/12345688.html')
    ,('http://www.site2.com/prod/123/text-of-di456fferent-89-len/12345688.html')
    )
SELECT substring(link, '/(\d+)\.html') FROM x;

regexp_matches()用于捕获多个匹配,并不是一个好的选择。

答案 1 :(得分:1)

我不是postgresql的人,但看起来它有一些内置的正则表达式函数。请参阅PostgreSQL Matching Functions,并找到它描述regexp_matches功能的部分。 regexp_matches返回一个数组({})。

SELECT regexp_matches(link, '([0-9]+)\.html$');

将此与unnest相结合,请参阅PostgreSQL Arrays

SELECT unnest(SELECT regexp_matches(link, '([0-9]+)\.html$')) as matches;

答案 2 :(得分:0)

此代码段将为您提供任何网址的文件名:

SELECT REVERSE(SUBSTRING(REVERSE(REPLACE('http://www.somewhere.com/folder/page.html', '\', '/')), 1, CHARINDEX('/', REVERSE(REPLACE('http://www.somewhere.com/folder/page.html', '\', '/'))) - 1)) as PageName

输出

  

page.html中

或者,如果您将url作为nvarchar变量传递:

SELECT REVERSE(SUBSTRING(REVERSE(REPLACE(@Url, '\', '/')), 1, CHARINDEX('/', REVERSE(REPLACE(@Url, '\', '/'))) - 1)) as PageName

答案 3 :(得分:0)

另一种选择是使用子串函数:

select substring(link from '[0-9]+')
from your_table;

这假设网址中只有一个“数字”。