2011-07-26 8 views
8

मैं ओरेकल मंच स्थल पर एक उदाहरण खोजने के स्ट्रिंग से अल्पविराम के हटाने इसके विपरीत बनाना चाहते हैं। () के अंदर से इस चरित्र को , हटाएं और बाहर रहें।REGEXP_REPLACE केवल यदि) में बंद (के

आउटपुट: a, b, c (x y z), a, (xx yy zz), x,

+0

कितने ',' आप के बीच '()' उम्मीद करते हैं? Oracle में –

+1

REGEXP_REPLACE स्वाद POSIX ERE का उपयोग करता है जिसमें सुविधा के चारों ओर कोई नज़र नहीं है। यह जानकारी [यहां] से ली गई है (http://www.regular-expressions.info/refflavors.html) –

+1

@ bw_üezi की टिप्पणी में जोड़ने के लिए - मैंने पुष्टि की है कि 'REGEXP_REPLACE' का उपयोग करके ओरेकल में लुकराउंड समर्थित नहीं हैं। * अनिवार्य टिप्पणी *: यह डेटा की तरह दिखता नहीं है जो डेटाबेस में कच्चे होना चाहिए - विशेष रूप से यदि आप इसे पूछने जा रहे हैं। क्या आप वाकई इसे सामान्य नहीं कर सकते हैं? (मुझे पता है कि आप शायद इस बिंदु पर नहीं कर सकते ...) – Kobi

उत्तर

3

इस कोष्ठक में के साथ बहस की एक निरंतर अवधि के लिए काम करेंगे।

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

अद्यतन @ कोबी की टिप्पणी से प्रेरित:
इस नियमित अभिव्यक्ति 1st, वैकल्पिक 2 और वैकल्पिक 3 ,() के बीच
यह 9 तक बढ़ाया जा सकता है निकालता है (मैं एक book है बताते हुए \ 1। .. \ 500

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

आप कुछ \ \ ((^ ^,] *?), ([^,)] *?), (? [^,)] का उपयोग कर सकते हैं *?) \) ',' (\ 1 \ 2 \ 3) '2 या 3 तत्वों का समर्थन करने के लिए, और इसे आसानी से तत्वों की उचित अधिकतम संख्या में विस्तारित कर सकते हैं। इस मामले में एक सामान्य रेगेक्स ढूँढना मुश्किल है ... – Kobi

+0

आप कितने() के बीच उम्मीद करते हैं? अनंत :)) इसलिए, यह नियमित अभिव्यक्ति अधिक सामान्य – hamdi

+2

@hamdi होना चाहिए, आप 9 तत्वों का समर्थन करने के लिए ब्रैकेट के बीच 4 तत्वों के साथ चलाने के लिए यहां दिखाए गए इस रेगेक्स को बढ़ा सकते हैं। असीमित तत्वों से निपटने के लिए एसक्यूएल सही उपकरण नहीं हो सकता है। ओरेकल द्वारा समर्थित नहीं है, 'चारों ओर देखो' सुविधा द्वारा एक और सामान्य नियमित अभिव्यक्ति हासिल की जा सकती है। Oracle में –

1

सुनिश्चित नहीं हैं कि संभव हो जाना चाहिए लेकिन केवल \ 1 ... \ 9 काम किया) यदि REGEXP_REPLACE नकारात्मक नज़र Aheads का समर्थन करता है और behinds देखो, लेकिन अगर यह होता है यह काम करेगा: ,(?<!\)[^\(]*)(?![^\)]*\()

मैं के साथ सी # परीक्षण किया:

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

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

REGEXP_REPLACE स्वाद POSIX ERE का उपयोग करता है जिसमें सुविधा के चारों ओर कोई नज़र नहीं है। यह जानकारी यहां से ली गई है [http://www.regular-expressions.info/refflavors.html) –

1

वाले रेगुलर एक्सप्रेशन का इस्तेमाल किया की एक छोटी सी संशोधित संस्करण:

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

यह बहुत काम करता है धन्यवाद – hamdi

+0

@hamdi यदि यह काम करता है तो आप उत्तर स्वीकार कर सकते हैं :) – Karolis

संबंधित मुद्दे