sqlserver中正则表达式和分组查询

sqlserver中正则表达式和分组查询,第1张

使用vbscript 或者是frameword程序集向SqlServer数据库中添加一个正则表达式函数,就可以满足你的需求了嘛。

vbscript 函数(需要SqlServer运行环境中vbscript 库)

CREATE function [dbo][RegexMatchFirst]

(

@source ntext, --原字符串

@regexp varchar(1000), --正则表达式

@global bit = 1, --是否是全局替换

@ignoreCase bit = 0 --是否忽略大小写

)

returnS varchar(1000) AS

begin

declare @hr integer

declare @objRegExp integer

declare @objMatch INT

declare @matchcount INT

declare @command varchar(50)

declare @result varchar(5000)

exec @hr = sp_OACreate 'VBScriptRegExp', @objRegExp OUTPUT

IF @hr <> 0 begin

exec @hr = sp_OADestroy @objRegExp

return null

end

exec @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp

IF @hr <> 0 begin

exec @hr = sp_OADestroy @objRegExp

return null

end

exec @hr = sp_OASetProperty @objRegExp, 'Global', @global

IF @hr <> 0 begin

exec @hr = sp_OADestroy @objRegExp

return null

end

exec @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignoreCase

IF @hr <> 0 begin

exec @hr = sp_OADestroy @objRegExp

return null

end

exec @hr = sp_OAMethod @objRegExp, 'execute', @objmatch OUTPUT, @source

IF @hr <> 0 begin

exec @hr = sp_OADestroy @objRegExp

return null

end

EXEC @hr= sp_OAGetProperty @objmatch, 'count', @matchcount OUT

IF @hr <> 0 or @objmatch = 0 begin

exec @hr = sp_OADestroy @objRegExp

return null

end

set @command = 'item(0)Value'

EXEC @hr= sp_OAGetProperty @objmatch, @command, @result OUT

exec @hr = sp_OADestroy @objRegExp

IF @hr <> 0 begin

return null

end

return @result

end

framework运行时程序集:

打开 Microsoft Visual Studio,创建一个sqlserver 数据库数据库项目,在项目中按照SqlServer方式创建一个正则表达式匹配函数,然后编译部署到你的SqlServer数据库中。

这个时候刷新数据库的可编程性-->函数 --> 标量值函数就会看到你在Microsoft Visual Studio中创建的自定义函数了。

用 Oracle Database 10g 使用正规表达式

您可以使用最新引进的 Oracle SQL REGEXP_LIKE *** 作符和 REGEXP_INSTR、REGEXP_SUBSTR 以及 REGEXP_REPLACE 函数来发挥正规表达式的作用。您将体会到这个新的功能如何对 LIKE *** 作符和 INSTR、SUBSTR 和 REPLACE 函数进行了补充。实际上,它们类似于已有的 *** 作符,但现在增加了强大的模式匹配功能。被搜索的数据可以是简单的字符串或是存储在数据库字符列中的大量文本。正规表达式让您能够以一种您以前从未想过的方式来搜索、替换和验证数据,并提供高度的灵活性。

正规表达式的基本例子

在使用这个新功能之前,您需要了解一些元字符的含义。句号 () 匹配一个正规表达式中的任意字符(除了换行符)。例如,正规表达式 ab 匹配的字符串中首先包含字母 a,接着是其它任意单个字符(除了换行符),再接着是字母 b。字符串 axb、xaybx 和 abba 都与之匹配,因为在字符串中隐藏了这种模式。如果您想要精确地匹配以 a 开头和以 b 结尾的一条三个字母的字符串,则您必须对正规表达式进行定位。脱字符号 (^) 元字符指示一行的开始,而美元符号 ($) 指示一行的结尾(参见表1:附表见第4页)。因此, 正规表达式 ^ab$ 匹配字符串 aab、abb 或 axb。将这种方式与 LIKE *** 作符提供的类似的模式匹配 a_b 相比较,其中 (_) 是单字符通配符。

默认情况下,一个正规表达式中的一个单独的字符或字符列表只匹配一次。为了指示在一个正规表达式中多次出现的一个字符,您可以使用一个量词,它也被称为重复 *** 作符。如果您想要得到从字母 a 开始并以字母 b 结束的匹配模式,则您的正规表达式看起来像这样:^ab$。 元字符重复前面的元字符 () 指示的匹配零次、一次或更多次。LIKE *** 作符的等价的模式是 a%b,其中用百分号 (%) 来指示任意字符出现零次、一次或多次。

表 2 给出了重复 *** 作符的完整列表。注意它包含了特殊的重复选项,它们实现了比现有的 LIKE 通配符更大的灵活性。如果您用圆括号括住一个表达式,这将有效地创建一个可以重复一定次数的子表达式。例如,正规表达式 b(an)a 匹配 ba、bana、banana、yourbananasplit 等。仅供参考!

好久没上百度了

首先,说一下我对问题的理解:

原文本:

sdjlaakjdfA目标数据Bskajfajl

sdjlasd332akjdfA目标数据2BskSDasd332ajl

sdjlaakjdfA目标数据3Bssde

想得到的文本:

目标数据

目标数据2

目标数据3

第二,我们可以换一种方式解决这个问题,使用字符串处理将"目标数据"提取出来便可

第三,也许不是楼主想要的解决之法

帮你写了一个html+js的小程序。。

将以下内容复制到记事本后,另存为"提取目标数据html"

<script type=text/javascript>

function fm(s,code){

eval(code);

return s;

}

f=0;

</script>

<form name="form1">

<textarea name="src" style="width:100%;height:400" onfocus="if(f){thisvalue='';f=0}" >sdjlaakjdfA目标数据Bskajfajl

sdjlasd332akjdfA目标数据2BskSDasd332ajl

sdjlaakjdfA目标数据3Bssde

</textarea>

<textarea name="code" style="width:60%;height:100"}" >var re=/A()B/g;

var t='';

while(reexec(s)!=null){

t+=(RegExp$1+'\n');

}

s=t;

</textarea>

<pre>

</pre>

<input onclick="thisformsrcvalue=fm(thisformsrcvalue,thisformcodevalue)" type="button" value="执行查找匹配">

</form>

说明:

代码中最重要一句是:

var re=/A()B/g;

这个正则表达式

使用时将"目标数据"的前缀"A"及后缀"B"修改一下便可。

注意:

如果"A","B"中有特殊字符时应进行正则表达式转义。

第四,针对你想添加字符串C的要求

只要修改这句代码

t+=(RegExp$1+'\n');

为:

t+=(RegExp$1+'C\n');

另外,如果你要加前缀D,那么修改为

t+=('D'+RegExp$1+'C\n');

要是回答的内容有问题,或认为不妥,请发送百度消息给我,消息内容加上本页网址哦。。

版本 2

程序集 彗星正则表达式类, , 公开

程序集变量 表达式, 对象

子程序 _初始化, , , 当基于本类的对象被创建后,此方法会被自动调用

局部变量 脚本对象, 对象

局部变量 ret, 变体型

脚本对象创建 (“MSScriptControlScriptControl”, )

脚本对象写属性 (“Language”, “VBScript”)

脚本对象数值方法 (“AddCode”, “Function GetRegExp()” + #换行符 + “Set GetRegExp=new RegExp” + #换行符 + “End Function”)

ret = 脚本对象通用方法 (“Eval”, “GetRegExp()”)

表达式 = ret取对象 ()

子程序 _销毁, , , 当基于本类的对象被销毁前,此方法会被自动调用

子程序 取表达式对象, 对象, 公开, GetRegExp

返回 (表达式)

子程序 准备就绪, 逻辑型, 公开, 查看正则表达式是否初始化完毕。

返回 (取反 (表达式是否为空 ()))

子程序 模式, 文本型, 公开, 设置或返回搜索的正则表达式模式。

参数 欲写入属性值, 文本型, 可空, 留空则为读,被搜索的正则字符串表达式。

如果真 (是否为空 (欲写入属性值))

返回 (表达式读文本属性 (“Pattern”, ))

如果真结束

表达式写属性 (“Pattern”, 欲写入属性值)

返回 (字符 (0))

子程序 忽略大小写, 逻辑型, 公开, 设置或返回一个逻辑值,指明模式搜索是否区分大小写。

参数 欲写入属性值, 逻辑型, 可空, 留空则为读,不留空则返回是否写入成功。

返回 (选择 (是否为空 (欲写入属性值), 表达式读逻辑属性 (“IgnoreCase”, ), 表达式写属性 (“IgnoreCase”, 欲写入属性值)))

子程序 全局匹配, 逻辑型, 公开, 设置或返回一个逻辑值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。

参数 欲写入属性值, 逻辑型, 可空, 留空则为读,不留空则返回是否写入成功。

返回 (选择 (是否为空 (欲写入属性值), 表达式读逻辑属性 (“Global”, ), 表达式写属性 (“Global”, 欲写入属性值)))

子程序 匹配多行, 逻辑型, 公开, 设置或返回是否匹配多行。

参数 欲写入属性值, 逻辑型, 可空

返回 (选择 (是否为空 (欲写入属性值), 表达式读逻辑属性 (“Multiline”, ), 表达式写属性 (“Multiline”, 欲写入属性值)))

子程序 执行, 对象, 公开, 对指定的字符串执行正则表达式搜索。

参数 欲被搜索的文本, 文本型, , 要在其上执行正则表达式的文本字符串。

返回 (表达式对象型方法 (“Execute”, 欲被搜索的文本))

子程序 搜索, 逻辑型, 公开, 对指定的字符串执行一个正则表达式搜索,并返回一个逻辑值指示是否找到匹配的模式。

参数 欲被搜索的文本, 文本型, , 要执行正则表达式搜索的文本字符串。

返回 (表达式逻辑方法 (“Test”, 欲被搜索的文本))

子程序 替换, 文本型, 公开, 换在正则表达式查找中找到的文本。

参数 欲被替换的文本, 文本型, , 将要进行文本替换的字符串

参数 用作替换的文本, 文本型, 可空, 用作替换的文本

返回 (表达式文本方法 (“Replace”, 欲被替换的文本, 用作替换的文本))

子程序 GetRegExp, 对象, 公开, 取表达式对象

返回 (表达式)

用第一个函数就行了,修改一下

Function GetImgSrc(str) '取得img 标签内容

Dim tmp, objRegExp, Matches, Match

Set objRegExp = New Regexp

objRegExpIgnoreCase = True '忽略大小写

objRegExpGlobal = True '全文搜索 !关键!

objRegExpPattern = "<img [^>]\bsrc=(['""])([^'""\x20]+)\1 [^>]>"

Set Matches = objRegExpExecute(str)

For Each Match In Matches

tmp = tmp & MatchSubMatches(1) & vbCrLf

Next

GetImgSrc = tmp

End Function

Private Sub Command1_Click()

Dim testStr, pattern, getStr As String

'从1txt文件中读取文件

Open AppPath & "\1txt" For Input As #1

While Not EOF(1)

Line Input #1, s

testStr = testStr & s & IIf(EOF(1), "", vbCrLf)

Wend

Close #1

'使用正则去掉其它字符的内容

pattern = "\d"

getStr = TestRegExp(pattern, testStr)

Open AppPath & "\2txt" For Output As #1

Print #1, getStr

Close #1

End Sub

Function TestRegExp(ByVal myPattern As String, ByVal myString As String)

Dim objRegExp As RegExp

Dim objMatch As Match

Dim colMatches As MatchCollection

Dim RetStr As String

Set objRegExp = New RegExp

objRegExpGlobal = True

objRegExpIgnoreCase = False

objRegExppattern = myPattern

If (objRegExpTest(myString) = True) Then

Set colMatches = objRegExpExecute(myString)

For Each objMatch In colMatches

RetStr = RetStr & objMatchValue

Next

Else

RetStr = myString

End If

TestRegExp = RetStr

End Function

'1txt 内容:A123,F45,C,555,B666,Z789,#234

'2txt 内容:12345555666789234

以上就是关于sqlserver中正则表达式和分组查询全部的内容,包括:sqlserver中正则表达式和分组查询、oracle SQL 正则表达式、按键精灵脚本制作,文本复制到EXCEL中等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9871758.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存