2015-05-29 77 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 [真]