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

问题描述 投票:6回答:2

在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,我将遇到问题)。

c# .net sql-server regex sql-server-2012
2个回答
4
投票

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

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

Debuggex Demo

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

Debuggex Demo


3
投票

你的正则表达式^.{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]

© www.soinside.com 2019 - 2024. All rights reserved.