在T-SQL中,我使用UNIQUEIDENTIFIER函数生成了NEWID()。例如:
723952A7-96C6-421F-961F-80E66A4F29D2
然后,删除所有破折号(-
),它看起来像这样:
723952A796C6421F961F80E66A4F29D2
现在,我需要使用以下格式UNIQUEIDENTIFIER
将上面的字符串转换为有效的xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
并再次设置破折号。
为了实现这一点,我正在使用SQL CLR
实现C#
RegexMatches
函数与这个^.{8}|.{12}$|.{4}
正则表达式,它给了我:
SELECT *
FROM [dbo].[RegexMatches] ('723952A796C6421F961F80E66A4F29D2', '^.{8}|.{12}$|.{4}')
使用上面的内容,我可以轻松地再次构建一个正确的UNIQUEIDENTIFIER
,但我想知道如何在正则表达式中评估OR
运算符。例如,以下内容不起作用:
SELECT *
FROM [dbo].[RegexMatches] ('723952A796C6421F961F80E66A4F29D2', '^.{8}|.{4}|.{12}$')
是否确定第一个正则表达式将首先匹配字符串的开头和结尾,然后是其他值,并且始终按此顺序返回匹配(例如,如果96C6
匹配421F
,我将遇到问题)。
如果您对使用|
alternation operator时会发生什么感兴趣,答案很简单:正则表达式引擎从左到右处理表达式和输入字符串。
以你所拥有的模式为例,^.{8}|.{12}$|.{4}
开始检查左边的输入字符串,并检查^.{8}
- 前8个字符。找到他们,这是一个匹配。然后,继续用.{12}$
找到最后12个字符,并再次匹配。然后,匹配任何4个字符的字符串。
接下来,你有^.{8}|.{4}|.{12}$
。表达式再次从左向右解析,前8个字符首先匹配,但接下来,只匹配4个字符的序列,.{12}
将不会触发,因为会有.{4}
匹配!
你的正则表达式^.{8}|.{12}$|.{4}
评估为:
从除\ n {正好8次}之外的任何字符开始
或者除了\ n之外的任何字符{正好12次}
或全局除\ n {正好4次}以外的任何字符
这意味着连续4个字符后的任何内容都将匹配,因为在一个> 4个字符的字符串中的某个地方连续有4个字符。
1 [假]
12 [假]
123 [false]
1234 [true]
12345 [true]
123456 [true]
1234567 [true]
12345678 [true]
123456789 [true]
1234567890 [true]
12345678901 [true]
123456789012 [true]
您可能正在寻找:
^.{8}$|^.{12}$|^.{4}$
哪个给你:
1 [假]
12 [假]
123 [false]
1234 [true]
12345 [false]
123456 [false]
1234567 [false]
12345678 [true]
123456789 [false]
1234567890 [false]
12345678901 [false]
123456789012 [true]