2012-06-14 136 views
8

我期望匹配一個字符串「Order By XXX」,其中XXX可以是任何字母,數字,句點,逗號,空格或方括號。然而,如果它是而不是(括號中的一邊是好的,只要它不在兩邊),我只想匹配它。所以應該從「」斜體字匹配的部分,通過它不應該在匹配正則表達式字符串,只要它沒有被括號包圍

匹配任何應符合(斜體匹配的部分):由Z與Y 爲了

  • 選擇X
  • 選擇Y =(由[ID]降序選擇由C 訂單頂部1 Z)

如果不匹配:

  • Y的選擇X(由Z順序)
  • 選擇AA,NTILE(4)OVER(由AB)按照AC組

我有一個由文字匹配的順序正則表達式的字符串: [ ]*order by [\w,.\[\] ]+。不過,我在正確使用前瞻/後面工作時遇到了一些麻煩。有關如何繼續的建議?

+2

我不能區分''(按照[ID] desc)從C順序選擇頂部1 Z'和僅按照您的條件選擇'(OVER Order by a.b)'。 – nhahtdh

+0

@nhahtdh - 是。在第二個例子中錯誤地放置了paren。編輯。 –

+0

我對正則表達式沒有太多的瞭解。到目前爲止,我只使用了一些非常小的。我找到了一個工具,你可以檢查你的正則表達式。也許它可以幫助你。這裏是鏈接http://www.asterworld.com/en/soft/010.html –

回答

1

試試這個:

(?<!\(\s*)order\s+by\s+[\w,.\[\] ]+(?<!\s*\)) 

當在PowerShell中進行了測試:

PS> @(
    'Select X from Y order by z' 
    'Select y = (select top 1 Z from C Order by [ID] desc)' 
    'Select X from Y (order by z)' 
    'Select a.a, NTILE(4) OVER (Order by a.b) group by a.c' 
    'Order by 87' 
    '(Order by 87)' 
    '(Order by 87)' 
    '(Order by 87)' 
    '(Order by 87)' 
    'Order by _foo' 
) -match '(?<!\(\s*)order\s+by\s+[\w,.\[\] ]+(?<!\s*\))' 

Select X from Y order by z 
Select y = (select top 1 Z from C Order by [ID] desc) 
Order by 87 
Order by _foo 

PS> 
+0

足夠接近我的目的,所以我接受。但是,這與'Select aa,NTILE(4)OVER (按照ac組排序,當根據這個問題應該匹配(打開paren沒有匹配關閉paren))。 –

+0

謝謝,雅科夫。我會考慮最後的20%。 :-) –

0

這對我的作品,讓我知道,如果有其他情況下,我的思念:
Regex r = new Regex(@"[^(](order by [^)]+)", RegexOptions.IgnoreCase);

+0

在前面的角色類匹配任何不是開頭的括號。因此,如果您針對'Select a.a,NTILE(4)OVER(a.b排序)組通過a.c'運行它,它會起作用(不匹配)。但是,如果您針對'Select aa,NTILE(4)OVER Order by ab)group by ac'(在「Order」之前帶走開頭paren)運行它,則它匹配「R OVER Order by ab」 - 因爲R 「Over」是一個不是公開的字符的字符。 –

+0

看來,這將匹配OP說不應該匹配的情況。 – nhahtdh

+0

也許我得到了這個錯誤,但多步驟正則表達式怎麼樣: 不接受on @「(order by [^)] +)OR @」[^(](order by。+)OR @「[^ (](order by [^)] +)。這樣我們就可以捕獲所有缺少括號的情況。 – user1456460

-1

你可以使用像這樣的替代:

\(?(order by [a-z0-9., \[\]]+)(?![a-z0-9., \[\]])(?<!\))|[^(](order by [a-z0-9., \[\]]+)\) 

「order by XXX」將被第一個或第二個捕獲括號捕獲。

+0

問題是,當它被括號包圍時,我**不希望它匹配。 –

+0

它應該只匹配,如果它只被一側或另一側的圓括號包圍,但不是兩側。 – Jack