2015-05-29 74 views
6

T-SQL我已经使用NEWID()函数生成了UNIQUEIDENTIFIER。例如:如何评估正则表达式OR运算符

723952A7-96C6-421F-961F-80E66A4F29D2 

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

723952A796C6421F961F80E66A4F29D2 

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

要做到这一点,我使用SQL CLR实现这一^.{8}|.{12}$|.{4}正则表达式的C#RegexMatches功能,给了我这样的:

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

是可以肯定的是,第一个正则表达式将开始和字符串,那么其他值结束第一相匹配,并且总是返回按此顺序匹配(如果例如96C6421F匹配,我将遇到问题)。

+0

此外,其原因'^ {8} |。{4} | {12} $'返回四个,而不是过去的12块是由于这样的事实使用匹配的第一个或(|)'值,**不是**最合格的。正则表达式解析器在看到'。{12} $'之前就会看到'。{4}',并且这样就可以在四边形中匹配它们。 –

+0

@EBrown,这种情况是复杂应用程序的一部分。我无法改变事情的完成方式。只需要找到一种方法来处理这种情况。 – gotqn

+0

@EBrown,那么它总是按顺序匹配'OR'块? – gotqn

回答

3

如果你有兴趣当您使用| 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

3

您正则表达式^.{8}|.{12}$|.{4}计算结果为:

与除\ N {整整8倍}

OR除了\任意字符N {整整12倍}

或除任何字符\任何字符开始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 [真]

你可能会寻找:

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

它给你:

1 [虚假]

12 [虚假]

123 [FALSE]

1234 [TRUE]

12345 [FALSE]

123456 [FALSE]

1234567 [FALSE]

12345678 [TRUE]

123456789 [false]

1234567890 [虚假]

12345678901 [虚假]

123456789012 [真]