匹配序列与精确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}不起作用,谷歌也没有帮助。

匹配序列与精确x或y或z重复

使用以下正则表达式:

@"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的解决方案,我发现它有点难读,但如果你熟悉正则表达式,则更清晰。