正则表达式是干嘛的(正则表达式是用来干什么的)
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)$
参考资料: