如何评估正则表达式OR运算符

got*_*tqn 6 .net c# regex sql-server sql-server-2012

T-SQL中,我使用NEWID()函数生成了UNIQUEIDENTIFIER.例如:

723952A7-96C6-421F-961F-80E66A4F29D2
Run Code Online (Sandbox Code Playgroud)

然后,-删除所有破折号(),它看起来像这样:

723952A796C6421F961F80E66A4F29D2
Run Code Online (Sandbox Code Playgroud)

现在,我需要UNIQUEIDENTIFIER使用以下格式xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx将上面的字符串转换为有效并再次设置破折号.

为了实现这一点,我使用这个正则表达式SQL CLRC# RegexMatches函数实现,^.{8}|.{12}$|.{4}这给了我:

SELECT *
FROM [dbo].[RegexMatches] ('723952A796C6421F961F80E66A4F29D2', '^.{8}|.{12}$|.{4}')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

使用上面的内容,我可以轻松地再次构建一个正确的,UNIQUEIDENTIFIER但我想知道如何OR在正则表达式中计算运算符.例如,以下内容不起作用:

SELECT *
FROM [dbo].[RegexMatches] ('723952A796C6421F961F80E66A4F29D2', '^.{8}|.{4}|.{12}$')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

它是确保第一个正则表达式将首先匹配的开始和字符串的结尾,那么其他的值,并且总是在这个顺序返回比赛(我会有问题,如果举例来说,96C6在后匹配421F).

Wik*_*żew 4

如果您|对使用交替运算符时发生情况感兴趣,答案很简单:正则表达式引擎从左到右处理表达式和输入字符串

以您的模式为例,^.{8}|.{12}$|.{4}从左侧开始检查输入字符串,并检查^.{8}- 前 8 个字符。找到它们并且匹配。然后,继续查找最后 12 个字符.{12}$,并且再次匹配。然后,匹配任何 4 个字符的字符串。

正则表达式可视化

调试演示

接下来,你有^.{8}|.{4}|.{12}$. 再次从左到右解析表达式,首先匹配前 8 个字符,接下来只会匹配 4 个字符序列,.{12}永远不会触发,因为会有.{4}匹配!

正则表达式可视化

调试演示