匹配序列与精确x或y或z重复
本文关键字:重复 | 更新日期: 2023-09-27 18:11:47
我想在sql脚本中替换datetime2的十六进制值。
它们看起来像
CAST(0x07000000000067B708 AS DateTime2)
And according tohttp://weblogs.sqlteam.com/peterl/archive/2010/12/15/the-internal-storage-of-a-datetime2-value.aspx可能的长度是14或16或18个十六进制字符。
现在在我的正则表达式中我可以做{14,18},这意味着14到18次重复。
但怎么能做14次、16次或18次重复(不是15次,也不是17次)?
sql = System.Text.RegularExpressions.Regex.Replace(sql, @"CAST's*'('s*0x[a-f0-9]{14,18}'s*AS's*datetime2's*')"
, new System.Text.RegularExpressions.MatchEvaluator(ReplaceDateTime2)
, System.Text.RegularExpressions.RegexOptions.IgnoreCase
);
我一直在https://msdn.microsoft.com/en-us/library/3206d374 (v = vs.110) . aspx但是没有描述如何使用or的语法,{14|16|18}不起作用,谷歌也没有帮助。
使用以下正则表达式:
@"CAST's*'('s*0x[a-f0-9]{14}(?:[a-f0-9]{2}){0,2}'s*AS's*datetime2's*')"
^^^^^^^^^^^^^^^^^^^^
[a-f0-9]{14}(?:[a-f0-9]{2}){0,2}
将匹配14个十六进制字符,然后出现0到2个十六进制字符。
:
-
CAST
-字符序列CAST
-
's*'('s*
- a(
两边用0+空格封闭 -
0x
-0x
子字符串 -
[a-f0-9]{14}
- 14十六进制字母或数字 -
(?:[a-f0-9]{2}){0,2}
- 0到2个十六进制字母或数字序列 -
's*AS's*
-子字符串AS
包含0+空白 -
datetime2
-子字符串datetime2
-
's*
- 0+ whitespaces -
')
-关闭文字)
.
查看regex演示
简单地做3个可能的分组:
((?:[a-f0-9]{12})|(?:[a-f0-9]{14})|(?:[a-f0-9]{16}))
或者,捕获较短的,使较长的可选:
([a-f0-9]{12}(?:[a-f0-9]{2})?(?:[a-f0-9]{2})?)
您可以使用一个替代组:
(?:[a-f0-9]{14}|[a-f0-9]{16}|[a-f0-9]{18})
或者使用@Wiktor的解决方案,我发现它有点难读,但如果你熟悉正则表达式,则更清晰。