1

如何提取和之间的/数值.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

4 回答 4

2

问题是:

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

一个正确的答案是:

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

\d[[:digit:]]..等价于 [0-9]的类简写
+.. 一个或多个前面的原子
().. 括号捕获匹配
\... 必须转义点以释放其特殊含义

测试:

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()用于捕获多个匹配项,因此不是一个好的选择。

于 2012-07-24T22:42:07.050 回答
1

我不是 postgresql 人,但它看起来有一些内置的正则表达式函数。请参阅PostgreSQL 匹配函数并找到它描述该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;
于 2012-07-24T21:29:42.390 回答
0

另一种选择是使用 substring 函数:

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

这假定 URL 中只有一个“数字”。

于 2012-07-24T22:00:56.893 回答
0

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

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
于 2012-07-24T21:28:47.210 回答