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

时间:2015-05-29 13:56:57

标签: c# .net sql-server regex sql-server-2012

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}')

enter image description here

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

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

enter image description here

确定第一个正则表达式首先匹配字符串的开头和结尾,然后是其他值,并且始终按此顺序返回匹配项(例如,96C6我会遇到问题在421F)之后匹配。

2 个答案:

答案 0 :(得分:4)

如果您对使用| alternation operator时会发生什么感兴趣,答案很简单:正则表达式引擎处理表达式并将输入字符串从处理到

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

Regular expression visualization

Debuggex Demo

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

Regular expression visualization

Debuggex Demo

答案 1 :(得分:3)

您的正则表达式<ul class="post-meta"> <li> <span class="post-meta-key">Procedure</span> <span class="pull-right">Weight Loss Surgery, Arm Lift</span> </li> <li> <span class="post-meta-key">Age</span> <span class="pull-right">44</span> </li> <li> <span class="post-meta-key">Location</span> <span class="pull-right">Surrey</span> </li> </ul>评估为:

从除\ n {恰好8次}

之外的任何字符开始

或除\ n {正好12次}

之外的任何字符

除了\ n {n {全程4次}全局

之外的任何字符

这意味着连续4个字符后的任何内容都将匹配,因为在> 4个字符的字符串中的某个地方,连续有4个字符。

1 [false]

12 [false]

123 [false]

1234 [true]

12345 [true]

123456 [true]

1234567 [true]

12345678 [true]

123456789 [true]

1234567890 [true]

12345678901 [true]

123456789012 [true]

您可能正在寻找:

^.{8}|.{12}$|.{4}

这给了你:

1 [false]

12 [false]

123 [false]

1234 [true]

12345 [false]

123456 [false]

1234567 [false]

12345678 [true]

123456789 [false]

1234567890 [false]

12345678901 [false]

123456789012 [true]