匹配序列与x或y或z重复完全匹配?

时间:2016-10-05 08:25:51

标签: c# regex

我想在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}不起作用,谷歌也没有帮助。

3 个答案:

答案 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的解决方案,如果您熟悉正则表达式,我会发现它更难阅读但更清晰。