Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

xóa từ cụ thể khỏi chuỗi

Do thiếu hỗ trợ cho lookbehind / lookahead ranh giới từ (\b ) trong việc triển khai biểu thức chính quy của Oracle, dường như không thể đáp ứng tất cả các yêu cầu trong một REGEXP_REPLACE cuộc gọi. Đặc biệt đối với trường hợp, được chỉ ra bởi Egor Skriptunoff :các kết quả phù hợp, theo sau là một dấu cách với duy nhất một dấu phân cách giữa chúng như some some some some ... .

Nếu không có trường hợp này, bạn có thể khớp tất cả các chuỗi như vậy với lệnh gọi này:

regexp_replace(
  source_string,                                       -- source string
  '([^[:alnum:]]|^)((\d)*some(\d)*)([^[:alnum:]]|$)',  -- pattern
  '\1\5',                                              -- leave separators in place
  1,                                                   -- start from beginning
  0,                                                   -- replace all occurences
  'im'                                                 -- case-insensitive and multiline 
);

Phần hoa văn:

(                -- start of Group #1
  [^[:alnum:]]   -- any non-alphanumeric character 
  |              -- or 
  ^              -- start of string or start of line 
)                -- end of Group #1
(                -- start of Group #2
  (              -- start of Group #3 
    \d           -- any digit
  )              -- end of Group #3
  *              -- include in previous group zero or more consecutive digits
  some           -- core string to match
  (              -- start of group #4
    \d           -- any digit
  )              -- end of group #4  
  *              -- include in previous group zero or more consecutive digits
)                -- end of Group #2
(                -- start of Group #5
  [^[:alnum:]]   -- any non-alphanumeric character 
  |              -- or
  $              -- end of string or end of line
)                -- end of Group #5

Vì dấu phân tách được sử dụng để đối sánh (Nhóm # 1 và Nhóm # 5) được bao gồm trong mẫu đối sánh, nó sẽ bị xóa khỏi chuỗi nguồn khi đối sánh thành công, vì vậy chúng tôi cần khôi phục các phần này bằng cách chỉ định trong regexp_replace thứ ba tham số.

Dựa trên giải pháp này, bạn có thể thay thế tất cả, thậm chí các lần lặp lại trong một vòng lặp.

Ví dụ:bạn có thể xác định một hàm như thế này:

create or replace function delete_str_with_digits(
  pSourceString in varchar2, 
  pReplacePart  in varchar2  -- base string (like 'some' in question)
)
  return varchar2
is
  C_PATTERN_START constant varchar2(100) := '([^[:alnum:]]|^)((\d)*';
  C_PATTERN_END   constant varchar2(100) := '(\d)*)([^[:alnum:]]|$)';

  vPattern         varchar2(4000);
  vCurValue        varchar2(4000);
  vPatternPosition binary_integer;
begin

  vPattern := C_PATTERN_START || pReplacePart || C_PATTERN_END;
  vCurValue := pSourceString;

  vPatternPosition := regexp_instr(vCurValue, vPattern);

  while(vPatternPosition > 0) loop
    vCurValue := regexp_replace(vCurValue, vPattern,'\1\5',1,0,'im');
    vPatternPosition := regexp_instr(vCurValue, vPattern);
  end loop;

  return vCurValue;  

end;

và sử dụng nó với SQL hoặc mã PL / SQL khác:

SELECT 
  delete_str_with_digits(
    'some text, -> awesome <- 123 someone, 3some3
     line of 7 :> some some some some some some some <
222some  another some1? some22 text 0some000', 
    'some'
  )  as result_string
FROM 
  dual

Ví dụ SQLFiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chèn đệ quy bằng mệnh đề kết nối

  2. 12c VARCHAR2 (32767)

  3. Cập nhật bảng Oracle với các giá trị từ tệp CSV

  4. cách đặt lại cột Identity trong Oracle

  5. thư mục oradiag_ <user> là gì?