Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

hapus kata tertentu dari string

Karena kurangnya dukungan untuk lookbehind/lookahead dan batas kata(\b ) dalam implementasi ekspresi reguler Oracle, tampaknya tidak mungkin untuk memenuhi semua persyaratan dalam satu REGEXP_REPLACE panggilan. Khusus untuk kasus, ditunjukkan oleh Egor Skriptunoff :pola cocok, diikuti satu per satu dengan hanya satu pemisah di antaranya seperti some some some some ... .

Tanpa kasus ini, semua string tersebut dapat dicocokkan dengan panggilan ini:

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 
);

Bagian pola:

(                -- 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

Karena pemisah yang digunakan untuk pencocokan (Grup #1 dan Grup #5) termasuk dalam pola kecocokan, pemisah itu akan dihapus dari string sumber pada kecocokan yang berhasil, jadi kita perlu memulihkan bagian ini dengan menentukan di regexp_replace ketiga parameter.

Berdasarkan solusi ini dimungkinkan untuk mengganti semua, bahkan kejadian berulang dalam satu lingkaran.

Misalnya, Anda dapat mendefinisikan fungsi seperti itu:

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;

dan gunakan dengan SQL atau kode PL/SQL lainnya:

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

contoh 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. Hasilkan Urutan tanggal dan waktu

  2. kueri sql untuk menemukan atribut yang cocok

  3. Bagaimana saya bisa membuat indeks unik di Oracle tetapi mengabaikan nol?

  4. Oracle Insert via Select dari beberapa tabel di mana satu tabel mungkin tidak memiliki baris

  5. Bagaimana Cara Menonaktifkan Pemicu di Oracle SQL Developer?