2011-07-26 14 views
8

Ben oracle forumu yerinde bir örnek bulmak) (içine YALNIZCA dizesinden virgül kaldırmak bunun tersini yapmak istiyorum. Bu karakteri , içinden () içinden çıkarın ve dışarıda kalın.REGEXP_REPLACE 'ın

Çıkış: a, b, c (x y z), a, (xx yy zz), x,

+0

kaç '' Eğer '()' arasına bekliyorsunuz? –

+1

Oracle'da REGEXP_REPLACE, etrafa bakma özelliği olmayan FlavIX ERE lezzetini kullanır. Bu bilgi [burada] 'dan alınmıştır (http://www.regular-expressions.info/refflavors.html) –

+1

@ bw_üezi'nin yorumuna eklemek için - Oracle'ın REGEXP_REPLACE özelliğini kullanarak desteklenmediğini onaylıyorum. * Zorunlu yorum *: Veritabanında ham olması gereken verilere benzemez - özellikle de sorgulayacaksanız. Normalleştiremediğinden emin misin? (Muhtemelen bu noktada yapamayacağını biliyorum ...) – Kobi

cevap

3

Bu parantez içinde argümanlar sabit bir süre boyunca çalışır. @ Kobi yorumuna esinlenerek

REGEXP_REPLACE(t.col1, '(\(.*?),(.*?),(.*?\))', '\1\2\3') new_col 

güncelleme:
bu düzenli ifade o 9'a kadar uzatılabilir 3 , () arasında
1., isteğe bağlı 2. ve isteğe kaldırır (I \ 1 belirten bir book ettik. REGEXP_REPLACE negatif görünüm Aheads destekler ve behinds bakmak, ama olursa bu işe olsaydı .. 500 \

REGEXP_REPLACE(t.col1, '\(([^,]*),([^,]*),?([^,]*),?([^,]*)\)', '(\1\2\3\4)') new_col 
+1

'\ (([^,] *?), ([^,)] *?),? ([^,)] Gibi bir şeyi kullanabilirsiniz *?) \) ',' (\ 1 \ 2 \ 3) ', 2 veya 3 elemanı desteklemek ve makul bir maksimum sayıda öğeye kolayca genişletebilir. Bu durumda genel bir regex bulmak zor… – Kobi

+0

() arasında kaç tane beklersiniz? Sonsuz :)) bu nedenle, bu normal ifade daha genel – hamdi

+2

@hamdi olmak için burada gösterilen bu regex 9 öğeleri desteklemek için köşeli ayraçlar arasında çalıştırmak için genişletebilirsiniz. Sonsuz sayıda eleman ile başa çıkmak için SQL doğru bir araç olmayabilir. Oracle tarafından desteklenmeyen 'etrafa bak' özelliği ile daha genel bir düzenli ifade elde edilebilir. –

1

emin değil) mümkün olabilir ama sadece \ 1 ... \ 9 çalıştı olmalıdır: ,(?<!\)[^\(]*)(?![^\)]*\()

Ben C# ile test:

string s = "a, b, c (x, y, z), a, (xx, yy, zz), x,"; 

Console.WriteLine(Regex.Replace(s, @",(?<!\)[^\(]*)(?![^\)]*\()", "")); 
+1

Oracle'da REGEXP_REPLACE, etrafa bakma özelliği olmayan FlavIX ERE lezzetini kullanır. Bu bilgi [buradan] (http://www.regular-expressions.info/refflavors.html) –

1

kullandığınız normal ifadenin Biraz değiştirilmiş versiyonu:

REGEXP_REPLACE(column_name, '((\)|^).*?(\(|$))|,', '\1') 
+0

'dan alınmıştır. Çok çalışıyor – hamdi

+0

@hamdi İşe yarıyorsa, cevabı kabul edebilirsiniz :) – Karolis

İlgili konular