我想在SQL脚本中替换datetime2的十六进制值。
他们看起来像
CAST(0x07000000000067B708 AS DateTime2)
根据 http://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 但是没有关于语法如何使用的描述,并且{14 | 16 | 18}不起作用,谷歌也没有帮助。
答案 0 :(得分:4)
使用以下正则表达式:
@"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次出现的2个十六进制字符。
详细:
CAST
- 文字字符序列CAST
\s*\(\s*
- (
两边都有0 +空格0x
- 0x
substring [a-f0-9]{14}
- 14个十六进制字母或数字(?:[a-f0-9]{2}){0,2}
- 0到2个十六进制字母或数字的序列\s*AS\s*
- 用0+空格包围的子串AS
datetime2
- 子字符串datetime2
\s*
- 0+ whitespaces \)
- 结束文字)
。请参阅regex demo
答案 1 :(得分:1)
只需制作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})?)
答案 2 :(得分:1)
您可以使用替换组:
(?:[a-f0-9]{14}|[a-f0-9]{16}|[a-f0-9]{18})
或者使用@ Wiktor的解决方案,如果您熟悉正则表达式,我会发现它更难阅读但更清晰。