2011-07-26 27 views
8

Tôi tìm thấy một ví dụ tại diễn đàn oracle trang web:REGEXP_REPLACE - xóa các dấu phẩy từ chuỗi CHỈ nếu kèm theo trong() 's

Input chuỗi: a, b, c (x, y, z), a, (xx, yy, zz), x,

WITH t AS (SELECT 'a, b, c (x, y, z), a, (xx, yy, zz), x,' col1 
     FROM dual) 
SELECT t.col1 
, REGEXP_REPLACE(t.col1, '(\(.*?\))|,', '\1') new_col 
FROM t 

Output: a b c (x, y, z) a (xx, yy, zz) x

Nhưng tôi muốn làm ngược lại điều đó. Chỉ cần xóa ký tự này , từ bên trong () và vẫn ở bên ngoài.

Đầu ra: a, b, c (x y z), a, (xx yy zz), x,

+0

bao nhiêu ', 'gì bạn mong đợi giữa'() '? –

+1

REGEXP_REPLACE trong Oracle sử dụng hương vị POSIX ERE không có tính năng nhìn xung quanh. Thông tin này được lấy từ [ở đây] (http://www.regular-expressions.info/refflavors.html) –

+1

Để thêm vào nhận xét của @ bw_üezi - Tôi đã xác nhận các giải pháp không được hỗ trợ trong Oracle bằng cách sử dụng 'REGEXP_REPLACE'. * Bình luận bắt buộc *: nó không giống như dữ liệu cần được làm trong cơ sở dữ liệu - đặc biệt nếu bạn định truy vấn nó. Bạn có chắc bạn không thể bình thường hóa nó? (Tôi biết bạn có thể không thể vào thời điểm này ...) – Kobi

Trả lời

3

Điều này sẽ làm việc cho một tham số không đổi trong ngoặc.

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

cập nhật lấy cảm hứng từ @ bình luận Kobi của:
biểu thức chính quy này loại bỏ 1, 2 tùy chọn và tùy chọn thứ 3 , giữa ()
nó có thể được mở rộng lên đến 9 (Tôi đã một book nêu \ 1. .. \ 500 nên có thể nhưng chỉ \ 1 ... \ 9 làm việc)

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

Bạn có thể sử dụng một cái gì đó như '\ (([^,] *?), ([^,)] *?),? ([^,)] *?) \) ',' (\ 1 \ 2 \ 3) 'để hỗ trợ 2 hoặc 3 phần tử, và có thể dễ dàng mở rộng nó đến một số lượng tối đa các phần tử hợp lý. Tìm một regex chung là khó khăn trong trường hợp này ... – Kobi

+0

có bao nhiêu, bạn có mong đợi giữa()? vô hạn :)) do đó, biểu thức chính quy này phải tổng quát hơn – hamdi

+2

@hamdi bạn có thể mở rộng regex này được hiển thị ở đây để chạy với 4 phần tử giữa các dấu ngoặc để hỗ trợ tối đa 9 phần tử. Để đối phó với vô số các phần tử SQL có thể không phải là công cụ thích hợp. Một biểu thức chính quy chung hơn có thể đạt được bằng tính năng 'nhìn xung quanh' không được hỗ trợ bởi Oracle. –

1

Không chắc chắn nếu REGEXP_REPLACE hỗ trợ aheads cái nhìn tiêu cực và tìm behinds, nhưng nếu nó thực hiện điều này sẽ làm việc: ,(?<!\)[^\(]*)(?![^\)]*\()

Tôi đã thử nghiệm với C#:

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

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

REGEXP_REPLACE trong Oracle sử dụng hương vị POSIX ERE không có tính năng nhìn xung quanh. Thông tin này được lấy từ [tại đây] (http://www.regular-expressions.info/refflavors.html) –

1

Một phiên bản sửa đổi nhỏ của biểu thức chính quy bạn sử dụng:

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

nó hoạt động nhờ rất nhiều – hamdi

+0

@hamdi Nếu nó hoạt động thì bạn có thể chấp nhận câu trả lời :) – Karolis

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