正则表达式是干嘛的(正则表达式是用来干什么的)

http://www.itjxue.com  2023-01-29 06:20  来源:未知  点击次数: 

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

使用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 'VBScript.RegExp', @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中创建的自定义函数了。

正则表达式/g是干什么用,既然前面都是结束字符,还加个g干什么?

一楼说得对,这并不是正则的内容,只有这段是正则:(\d+)\.(\d+)\.(\d+)\.(\d+)

这段是所有语言里都一样的,真的正则。

正则前后在/

的,你用的应该是JS了,

g是正则选项,不属于匹配内容。除了g,还有

i

忽略大小写,

m,

多行匹配等

正则表达式验证日期是否大于某个日期

正则表达式擅长的领域是字符匹配而非数字比较,因此想要通过正则表达式来比较数字的话,一定会事倍功半。

但是这个效果还是可以实现的。

例如,匹配日期大于2014-2-21的日期

^(?![0-1])(?!200)(?!201[0-3])(?=2014|(?'big'\d{4}))\d{4}-

(?(big)\d{1,2}|(\d{2}|2|(?'big'[3-9])))-

(?(big)\d{1,2}|((?!1)(?!2[0-1])\d{2}))$

JS 中的 $ 干什么的

当引入了jQuery后,$就是jQuery的缩写。

例如:$('a') == jQuery('a')

{[a-zA-Z-|_\\s]+这个正则表达式是做什么的?

以{}开头和结尾的,中间是一个以上的字母(大小写)或者-,|,_,空白符的字符串。

不过可能这个表达式有问题,字符组中“-”应该放在第一个,否则便是一个元字符,表示一个范围,这里把它放在了中间位置,会导致不可预料的结果。

正则表达式 日期

最简单的正则 如 : \d{4}-\d{2}-\d{2}

但是实际情况却不是那么简单,,要考虑,有效性和闰年等问题.....

对于日期的有效范围,不同的应用场景会有所不同。MSDN中定义的DateTime对象的有效范围是:0001-01-01 00:00:00到9999-12-31 23:59:59。

UNIX时间戳的0按照ISO 8601规范为 :1970-01-01T00:00:00Z。

先考虑与年份无关的前三条规则,年份可统一写作

(?!0000)[0-9]{4}

下面仅考虑月和日的正则

1. 包括平年在内的所有年份的月份都包含1-28日

(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])

2. 包括平年在内的所有年份除2月外都包含29和30日

(0[13-9]|1[0-2])-(29|30)

3. 包括平年在内的所有年份1、3、5、7、8、10、12月都包含31日

(0[13578]|1[02])-31)

合起来就是除闰年的2月29日外的其它所有日期

(?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)

接下来考虑闰年的实现

1 : 四年一闰

([0-9]{2}(0[48]|[2468][048]|[13579][26])

2 : 百年不闰,四百年再闰

(0[48]|[2468][048]|[13579][26])00

3 : 合起来就是所有闰年的2月29日

([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)

四条规则都已实现,且互相间没有影响,合起来就是所有符合DateTime范围的日期的正则

^((?!0000)[0-9]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)|([0-9]{2}(0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)$

考虑到这个正则表达式仅仅是用作验证,所以捕获组没有意义,只会占用资源,影响匹配效率,所以可以使用非捕获组来进行优化。

^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$

参考资料:

(责任编辑:IT教学网)

更多