2012-06-14 34 views
8

Tôi đang tìm một chuỗi "Thứ tự theo XXX" trong đó XXX có thể là bất kỳ chữ cái, số, dấu chấm, dấu phẩy, dấu cách hoặc dấu ngoặc vuông nào. Tuy nhiên, tôi chỉ muốn kết hợp điều này nếu nó là không được bao quanh bởi dấu ngoặc đơn (dấu ngoặc đơn ở một bên là ok, miễn là nó không ở cả hai bên). Vì vậy, nó phải phù hợp với phần in nghiêng từ "", bởi nó không phải phù hợp với bất cứ điều gì trongChuỗi kết hợp với Regex miễn là nó không được bao quanh bởi dấu ngoặc đơn

nên phù hợp (phần phù hợp in nghiêng):

  • Chọn X từ Y trật tự bởi z
  • chọn y = (chọn top 1 Z từ C Sắp xếp theo [ID] desc)

nên không khớp nhau:

  • Chọn X từ Y (thứ tự theo z)
  • Chọn aa, NTILE (4) OVER (Sắp xếp theo ab) nhóm bởi ac

Tôi có chuỗi regex cho phù hợp với thứ tự bằng văn bản: [ ]*order by [\w,.\[\] ]+. Tuy nhiên, tôi đang gặp một số rắc rối khi nhận được sự chú ý/sau công việc đúng cách. Bạn có lời khuyên nào về cách tiến hành không?

+2

Tôi không thể phân biệt giữa '(chọn top 1 Z từ C Order theo [ID] desc)' và '(OVER Order by a.b)' với tiêu chí của bạn. – nhahtdh

+0

@nhahtdh - yup. đặt sai dấu ngoặc trong ví dụ thứ hai. Đã chỉnh sửa. –

+0

Tôi không có nhiều biểu thức chính quy. Tôi chỉ sử dụng một số thứ rất tầm thường cho đến bây giờ. Tôi tìm thấy một công cụ mà bạn có thể kiểm tra regex của bạn. Có lẽ nó cũng có thể giúp bạn. đây là liên kết http://www.asterworld.com/en/soft/010.html –

Trả lời

1

Hãy thử điều này:

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

Khi thử nghiệm trong 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

Đóng đủ để phục vụ cho mục đích của tôi vì vậy tôi chấp nhận, tuy nhiên, điều này không khớp với 'Select aa, NTILE (4) OVER (Sắp xếp theo nhóm ab bởi ac', khi theo câu hỏi này nên phù hợp (mở paren mà không có một paren đóng phù hợp). –

+0

Cảm ơn, Yaakov. Tôi sẽ nghĩ về điều đó 20% cuối cùng. :-) –

0

này làm việc cho tôi, cho tôi biết nếu có những trường hợp khác mà tôi đang mất tích:
Regex r = new Regex(@"[^(](order by [^)]+)", RegexOptions.IgnoreCase);

+0

lớp nhân vật ở mặt trước khớp với bất kỳ thứ gì không phải là dấu ngoặc đơn mở. Vì vậy, nếu bạn chạy nó với nhóm 'Select a.a, NTILE (4) OVER (Order by a.b) bởi a.c' nó hoạt động (không khớp). Tuy nhiên, nếu bạn chạy nó với nhóm 'Select aa, NTILE (4) OVER Order by ab) bởi ac' (lấy đi paren mở trước" Order ") thì nó khớp với" R OVER Order by ab "- kể từ khi R "Over" là một ký tự không phải là dấu ngoặc mở. –

+0

Có vẻ như điều này sẽ khớp với trường hợp OP nói không nên khớp. – nhahtdh

+0

Có thể tôi đã nhận được điều này sai nhưng những gì về một regex nhiều bước: Không chấp nhận trên @ "(order by [^)] +) HOẶC @" [^ (] (order by. +) OR @ "[^ (] (theo thứ tự [^)] +) Bằng cách này chúng ta bắt được tất cả các trường hợp thiếu dấu ngoặc đơn – user1456460

-1

bạn có thể sử dụng luân phiên như sau:

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

"thứ tự của XXX" sẽ được chụp bằng dấu ngoặc đơn thứ nhất hoặc thứ hai.

+0

Vấn đề là khi nó được bao quanh bởi dấu ngoặc đơn, tôi không ** muốn nó khớp. –

+0

nó chỉ phù hợp nếu nó chỉ được bao quanh bởi dấu ngoặc đơn ở một bên hoặc khác nhưng không phải cả hai. – Jack

Các vấn đề liên quan