在SQL中从字符串中提取子字符串

时间:2011-04-27 12:07:22

标签: sql regex tsql sql-server-2008

我需要提取一个被***[some text]字符串包围的文本,如下例所示:

some text
some text
***[some text]
THIS SHOULD BE EXTRACTED
***[some text]
some text
some text
some text
some text
some text
***[some text]
THIS SHOULD BE EXTRACTED TOO
***[some text]
some text

输出应为:

THIS SHOULD BE EXTRACTED
THIS SHOULD BE EXTRACTED TOO

我在这里试过PATINDEX,但是找不到提取字符串的方法。

PATINDEX('%[*][*][*][[]%]%%[*][*][*][[]%]%',@Text)

我期待听到任何建议。

5 个答案:

答案 0 :(得分:4)

对于您可以做的评论中提出的更容易的案例

;WITH T(C) AS
(
 SELECT '
    some text
    some text
    ***[some text 1]
    THIS SHOULD BE EXTRACTED
    ***[some text 2]
    some text
    some text
    some text
    some text
    some text
    ***[some text 1]
    THIS SHOULD BE EXTRACTED TOO
    ***[some text 2]
    some text'
)
SELECT col.value('.','varchar(max)')
FROM T
CROSS APPLY (SELECT CAST('<a keep="false">' + 
                        REPLACE(
                            REPLACE(C,'***[some text 2]','</a><a keep="false">'),
                        '***[some text 1]','</a><a keep="true">') + 
                    '</a>' AS xml) as xcol) x
CROSS APPLY xcol.nodes('/a[@keep="true"]') tab(col)

答案 1 :(得分:2)

我可能错了,但我认为没有一种干净的方法可以直接在SQL中执行此操作。我会使用CLR stored procedure并使用C#中的正则表达式或您选择的.NET语言。

有关使用正则表达式的相关示例,请参阅this article(或this article)。

答案 2 :(得分:2)

您可以在我的博客中找到: http://sql-tricks.blogspot.com/2011/04/extract-strings-with-delimiters.html 它是纯粹的解决方案,没有额外的修改,只有分隔符序列应该被贴上标签。

答案 3 :(得分:2)

不是正则表达式解决方案,我仍然是SQL新手,所以可能不是最佳的,但您应该能够使用

解析WHILE循环 对于CHARINDEX

***然后将其作为起点 CHARINDEXLF使用它作为
的起点 SUBSTRING的结尾点是下一个CHARINDEX的{​​{1}} 将Substring连接到输出,移过结尾***并循环查找下一个。

我会玩一些,看看我是否可以添加一个例子 编辑 - 这可能需要更多错误检查

***

答案 4 :(得分:0)

我相信您可以使用http://www.codeproject.com/KB/mcpp/xpregex.aspx?q=use+sql+function+to+parse+text中描述的xp_regex_match来解析您的nvarchar字段。我写了类似的东西。