Di Oracle, REGEXP_INSTR()
fungsi mencari string untuk pola ekspresi reguler. Ini mengembalikan bilangan bulat yang menunjukkan posisi awal atau akhir dari substring yang cocok (mana pun yang Anda tentukan).
Ini memperluas fungsionalitas INSTR()
fungsi dengan memungkinkan kita untuk menggunakan pola ekspresi reguler.
Sintaks
Sintaksnya seperti ini:
REGEXP_INSTR ( source_char, pattern
[, position
[, occurrence
[, return_opt
[, match_param
[, subexpr ]
]
]
]
]
)
Dimana:
source_char
adalah ekspresi karakter yang berfungsi sebagai nilai pencarian.pattern
adalah ekspresi reguler.position
adalah bilangan bulat positif yang menentukan tempat untuk memulai pencarian. Standarnya adalah1
, artinya, mulailah pencarian pada karakter pertama.occurrence
adalah bilangan bulat positif yang menentukan kejadian mana yang akan dicari. Standarnya adalah1
, yang berarti mencari kemunculan pertama.return_opt
menentukan apakah Oracle harus mengembalikan posisi awal atau akhir dari substring yang cocok. Gunakan0
untuk permulaan, dan1
untuk akhir. Nilai defaultnya adalah0
.match_param
memungkinkan Anda mengubah perilaku pencocokan default dari fungsi tersebut. Misalnya, ini memungkinkan Anda untuk menentukan sensitivitas huruf besar-kecil, bagaimana beberapa baris dan spasi ditangani, dll. Argumen ini bekerja sama seperti ketika digunakan denganREGEXP_COUNT()
fungsi. Lihat dokumentasi Oracle untuk fungsi tersebut untuk informasi lebih lanjut.- Untuk
pattern
dengan subekspresi,subexpr
adalah bilangan bulat nonnegatif dari 0 hingga 9 yang menunjukkan subekspresi mana dalampattern
akan dikembalikan oleh fungsi. Argumen ini bekerja sama seperti ketika digunakan denganREGEXP_INSTR()
fungsi. Lihat dokumentasi Oracle untuk informasi lebih lanjut tentang fungsi tersebut.
Contoh
Berikut adalah contoh dasar penggunaan REGEXP_INSTR()
di Oracle:
SELECT
REGEXP_INSTR('My dogs are fluffy', 'd.g')
FROM DUAL;
Hasil:
4
Dalam hal ini ada kecocokan, dan posisi awal substring dikembalikan.
Ekspresi reguler bisa sangat kuat, dan contoh ini menggunakan contoh yang sangat sederhana. Untuk menggunakan REGEXP_INSTR()
secara efektif, Anda harus mengetahui pola yang benar untuk digunakan untuk hasil yang diinginkan.
Tidak Cocok
Berikut ini contoh di mana tidak ada kecocokan:
SELECT REGEXP_INSTR('My dogs like dregs', 't.g')
FROM DUAL;
Hasil:
0
Tidak ada yang cocok, jadi 0
dikembalikan.
Beberapa Kecocokan
Berikut ini contoh dengan beberapa kecocokan:
SELECT
REGEXP_INSTR('My dogs have dags', 'd.g')
FROM DUAL;
Hasil:
4
Itu mengembalikan posisi kemunculan pertama.
Namun, Anda dapat menentukan kemunculan mana yang akan diganti:
SELECT
REGEXP_INSTR('My dogs have dags', 'd.g', 1, 2)
FROM DUAL;
Hasil:
14
Perhatikan bahwa saya menambahkan dua argumen di sini; 1
dan 2
. 1
menentukan keberadaan dalam string untuk memulai pencarian (dalam hal ini, pada karakter pertama). 2
adalah apa yang menentukan kejadian mana yang harus dicari. Dalam hal ini, kemunculan kedua dicari.
Inilah yang terjadi jika saya memulai pencarian setelah kemunculan pertama:
SELECT
REGEXP_INSTR('My dogs have dags', 'd.g', 8, 2)
FROM DUAL;
Hasil:
0
Dalam hal ini tidak ada kecocokan, karena hanya ada satu kejadian lagi setelah posisi awal.
Jika saya mengubah argumen terakhir menjadi 1
, maka kita mendapatkan kecocokan (karena ini adalah kemunculan pertama setelah posisi awal yang ditentukan):
SELECT
REGEXP_INSTR('My dogs have dags', 'd.g', 8, 1)
FROM DUAL;
Hasil:
14
Kembalikan Posisi Akhir
Anda dapat meneruskan argumen kelima dari 0
atau 1
untuk menentukan apakah fungsi harus mengembalikan posisi awal atau akhir substring.
Nilai defaultnya adalah 0
(untuk posisi awal). Inilah yang terjadi jika kita menentukan 1
:
SELECT
REGEXP_INSTR('My dogs are fluffy', 'd.g', 1, 1, 1)
FROM DUAL;
Hasil:
7
Untuk lebih jelasnya, ini dia lagi jika dibandingkan dengan 0
:
SELECT
REGEXP_INSTR('My dogs are fluffy', 'd.g', 1, 1, 0) AS "Start",
REGEXP_INSTR('My dogs are fluffy', 'd.g', 1, 1, 1) AS "End"
FROM DUAL;
Hasil:
Start End ________ ______ 4 7
Sensitivitas Huruf Besar
REGEXP_INSTR()
function mengikuti aturan penentuan dan derivasi susunan Oracle, yang menentukan susunan yang akan digunakan saat mencocokkan string dengan pola.
Namun, Anda dapat secara eksplisit menentukan sensitivitas huruf besar-kecil dengan argumen keenam opsional. Saat Anda melakukannya, ini akan menggantikan sensitivitas huruf besar atau kecil atau sensitivitas aksen dari susunan yang ditentukan.
Anda dapat menentukan i
untuk pencocokan case-insensitive dan c
untuk pencocokan peka huruf besar/kecil.
Ini contohnya:
SELECT
REGEXP_INSTR('My Cats', 'c.t', 1, 1, 0) AS "Default",
REGEXP_INSTR('My Cats', 'c.t', 1, 1, 0, 'i') AS "Case Insensitive",
REGEXP_INSTR('My Cats', 'c.t', 1, 1, 0, 'c') AS "Case Sensitive"
FROM DUAL;
Hasil:
Default Case Insensitive Case Sensitive __________ ___________________ _________________ 0 4 0
Susunan saya tampaknya peka terhadap huruf besar-kecil, berdasarkan hasil ini. Dua string lainnya dipaksa untuk pencocokan case-insensitive dan case-sensitive masing-masing.
Subekspresi
Berikut adalah contoh penggunaan argumen keenam untuk mengembalikan pola subekspresi tertentu:
SELECT REGEXP_INSTR(
'catdogcow',
'(c.t)(d.g)(c.w)',
1, 1, 0, 'i', 1
)
FROM DUAL;
Hasil:
1
Dalam hal ini saya mengembalikan subekspresi pertama.
Inilah yang terjadi jika saya menentukan subekspresi ketiga:
SELECT REGEXP_INSTR(
'catdogcow',
'(c.t)(d.g)(c.w)',
1, 1, 0, 'i', 3
)
FROM DUAL;
Hasil:
7
Argumen Null
Dengan pengecualian argumen ke-6, memberikan null
untuk argumen menghasilkan null
:
SET NULL 'null';
SELECT
REGEXP_INSTR(null, 'c.t', 1, 1, 0, 'i', 1) AS "1",
REGEXP_INSTR('Cat', null, 1, 1, 0, 'i', 1) AS "2",
REGEXP_INSTR('Cat', 'c.t', null, 1, 0, 'i', 1) AS "3",
REGEXP_INSTR('Cat', 'c.t', 1, null, 0, 'i', 1) AS "4",
REGEXP_INSTR('Cat', 'c.t', 1, 1, null, 'i', 1) AS "5",
REGEXP_INSTR('Cat', 'c.t', 1, 1, 0, null, 1) AS "6",
REGEXP_INSTR('Cat', 'c.t', 1, 1, 0, 'i', null) AS "7"
FROM DUAL;
Hasil:
1 2 3 4 5 6 7 _______ _______ _______ _______ _______ ____ _______ null null null null null 0 null
Secara default, SQLcl dan SQL*Plus mengembalikan ruang kosong setiap kali null
terjadi sebagai akibat dari SQL SELECT
penyataan.
Namun, Anda dapat menggunakan SET NULL
untuk menentukan string berbeda yang akan dikembalikan. Di sini saya menetapkan bahwa string null
harus dikembalikan.
Jumlah Argumen Salah
Tidak meneruskan argumen ke fungsi, atau terlalu sedikit, menghasilkan kesalahan:
SELECT REGEXP_INSTR()
FROM DUAL;
Hasil:
Error starting at line : 1 in command - SELECT REGEXP_INSTR() FROM DUAL Error at Command Line : 1 Column : 8 Error report - SQL Error: ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function" *Cause: *Action:
Hal yang sama berlaku ketika kita memberikan terlalu banyak argumen:
SELECT REGEXP_INSTR('Cat', 'c.t', 1, 1, 1, 'i', 1, 'oops')
FROM DUAL;
Hasil:
Error starting at line : 1 in command - SELECT REGEXP_INSTR('Cat', 'c.t', 1, 1, 1, 'i', 1, 'oops') FROM DUAL Error at Command Line : 1 Column : 8 Error report - SQL Error: ORA-00939: too many arguments for function 00939. 00000 - "too many arguments for function" *Cause: *Action:
Informasi Lebih Lanjut
REGEXP_INSTR()
fungsi (serta implementasi ekspresi reguler Oracle lainnya) sesuai dengan standar ekspresi reguler Antarmuka Sistem Operasi Portabel (POSIX) IEEE dan Pedoman Ekspresi Reguler Unicode dari Konsorsium Unicode.
Lihat dokumentasi Oracle untuk informasi lebih lanjut dan contoh REGEXP_INSTR()
fungsi.