我需要提取一个被***[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)
我期待听到任何建议。
答案 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
, ***
然后将其作为起点
CHARINDEX
到LF
使用它作为
的起点
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字段。我写了类似的东西。