如何从字符串中获取部分字符串
问题描述:
如何提取/
和.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%')
答
我不是一个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;
答
这个片段会给你任何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.htm升
或者,如果你在传递URL作为一个nvarchar变量:
SELECT REVERSE(SUBSTRING(REVERSE(REPLACE(@Url, '\', '/')), 1, CHARINDEX('/', REVERSE(REPLACE(@Url, '\', '/'))) - 1)) as PageName
答
另一种选择是使用字符串函数:
select substring(link from '[0-9]+')
from your_table;
这假设是,这正是一个 “号”网址。
答
的问题是:
我怎样可以提取之间的数值/和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()
是为捕获多个比赛和不是一个很好的选择。
+0
Brandstetter修改,我不知道,子可以采取正则表达式。我同意,你的回答更适合这个问题。 – zamnuts 2012-07-31 19:17:48
它给了我很奇怪的结果,我不知道如何去除'{'和'} – Andrew 2012-07-24 21:33:18
@Andrew,我不知道我的编辑是否可以工作,因为我只有SQL经验和不PostgreSQL的,但这个想法是regexp_matches返回一个数组,你需要再访问该阵列,或将其转化为表行,我试图把它变成表行。 – zamnuts 2012-07-24 21:47:32
无需UNNEST:'选择(regexp_matches(联系, '[0-9] +'))[1] 从网址;' – 2012-07-24 21:51:44