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

REGEXP_INSTR () Hàm trong Oracle

Trong Oracle, REGEXP_INSTR() hàm tìm kiếm một chuỗi cho một mẫu biểu thức chính quy. Nó trả về một số nguyên cho biết vị trí bắt đầu hoặc kết thúc của chuỗi con phù hợp (bất kỳ chuỗi con nào bạn chỉ định).

Nó mở rộng chức năng của INSTR() bằng cách cho phép chúng tôi sử dụng các mẫu biểu thức chính quy.

Cú pháp

Cú pháp như sau:

REGEXP_INSTR ( source_char, pattern
               [, position
                  [, occurrence
                     [, return_opt
                        [, match_param
                           [, subexpr ]
                        ]
                     ]
                  ]
               ]
             )

Ở đâu:

  • source_char là một biểu thức ký tự đóng vai trò là giá trị tìm kiếm.
  • pattern là biểu thức chính quy.
  • position là một số nguyên dương chỉ định nơi bắt đầu tìm kiếm. Giá trị mặc định là 1 , nghĩa là bắt đầu tìm kiếm ở ký tự đầu tiên.
  • occurrence là một số nguyên dương chỉ định sự xuất hiện nào cần tìm kiếm. Giá trị mặc định là 1 , có nghĩa là các tìm kiếm cho lần xuất hiện đầu tiên.
  • return_opt chỉ định liệu Oracle sẽ trả về vị trí đầu hay cuối của chuỗi con đã so khớp. Sử dụng 0 cho phần đầu và 1 cho phần kết. Giá trị mặc định là 0 .
  • match_param cho phép bạn thay đổi hành vi đối sánh mặc định của hàm. Ví dụ:nó cho phép bạn chỉ định phân biệt chữ hoa chữ thường, cách xử lý nhiều dòng và khoảng trắng, v.v. Đối số này hoạt động giống như khi được sử dụng với REGEXP_COUNT() hàm số. Xem tài liệu của Oracle về chức năng đó để biết thêm thông tin.
  • Đối với pattern với biểu thức con, subexpr là một số nguyên không âm từ 0 đến 9 cho biết biểu thức con nào trong pattern được trả về bởi hàm. Đối số này hoạt động giống như khi được sử dụng với REGEXP_INSTR() hàm số. Xem tài liệu của Oracle để biết thêm thông tin về chức năng đó.

Ví dụ

Đây là một ví dụ cơ bản về việc sử dụng REGEXP_INSTR() trong Oracle:

SELECT 
    REGEXP_INSTR('My dogs are fluffy', 'd.g')
FROM DUAL;

Kết quả:

4

Trong trường hợp này, có một kết quả khớp và vị trí bắt đầu của chuỗi con được trả về.

Biểu thức chính quy có thể rất mạnh và ví dụ này sử dụng một ví dụ rất đơn giản. Để sử dụng REGEXP_INSTR() một cách hiệu quả, bạn sẽ cần biết mẫu chính xác để sử dụng cho kết quả mong muốn.

Không phù hợp

Dưới đây là một ví dụ mà không có kết quả phù hợp nào:

SELECT REGEXP_INSTR('My dogs like dregs', 't.g')
FROM DUAL;

Kết quả:

0

Không có kết quả phù hợp, vì vậy 0 được trả lại.

Nhiều Kết hợp

Dưới đây là một ví dụ với nhiều kết quả phù hợp:

SELECT 
    REGEXP_INSTR('My dogs have dags', 'd.g')
FROM DUAL;

Kết quả:

4

Nó trả về vị trí của lần xuất hiện đầu tiên.

Tuy nhiên, bạn có thể chỉ định sự xuất hiện nào để thay thế:

SELECT 
REGEXP_INSTR('My dogs have dags', 'd.g', 1, 2)
FROM DUAL;

Kết quả:

14

Lưu ý rằng tôi đã thêm hai đối số ở đây; 12 . 1 chỉ định vị trí trong chuỗi để bắt đầu tìm kiếm (trong trường hợp này là ở ký tự đầu tiên). 2 là những gì chỉ định sự xuất hiện nào để tìm kiếm. Trong trường hợp này, lần xuất hiện thứ hai được tìm kiếm.

Đây là những gì sẽ xảy ra nếu tôi bắt đầu tìm kiếm sau lần xuất hiện đầu tiên:

SELECT 
REGEXP_INSTR('My dogs have dags', 'd.g', 8, 2)
FROM DUAL;

Kết quả:

0

Trong trường hợp này không có kết quả khớp nào, vì chỉ có một lần xuất hiện nữa sau vị trí xuất phát.

Nếu tôi thay đổi đối số cuối cùng thành 1 , sau đó chúng tôi nhận được một kết quả phù hợp (vì đó là lần xuất hiện đầu tiên sau vị trí bắt đầu được chỉ định):

SELECT 
REGEXP_INSTR('My dogs have dags', 'd.g', 8, 1)
FROM DUAL;

Kết quả:

14

Trả lại vị trí kết thúc

Bạn có thể chuyển đối số thứ năm của 0 hoặc 1 để chỉ định xem hàm nên trả về vị trí đầu hay cuối của chuỗi con.

Giá trị mặc định là 0 (cho vị trí đầu). Đây là những gì sẽ xảy ra nếu chúng tôi chỉ định 1 :

SELECT 
    REGEXP_INSTR('My dogs are fluffy', 'd.g', 1, 1, 1)
FROM DUAL;

Kết quả:

7

Chỉ cần nói rõ, đây là một lần nữa khi so sánh với 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;

Kết quả:

   Start    End 
________ ______ 
       4      7

Phân biệt chữ hoa chữ thường

REGEXP_INSTR() hàm tuân theo các quy tắc xác định đối chiếu và dẫn xuất của Oracle, quy tắc này xác định đối chiếu sẽ sử dụng khi khớp chuỗi với mẫu.

Tuy nhiên, bạn có thể chỉ định rõ ràng phân biệt chữ hoa chữ thường với đối số thứ sáu tùy chọn. Khi bạn làm điều này, nó sẽ ghi đè bất kỳ phân biệt chữ hoa chữ thường hoặc độ nhạy trọng âm nào của đối chiếu đã xác định.

Bạn có thể chỉ định i để đối sánh không phân biệt chữ hoa chữ thường và c để đối sánh phân biệt chữ hoa chữ thường.

Đây là một ví dụ:

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;

Kết quả:

   Default    Case Insensitive    Case Sensitive 
__________ ___________________ _________________ 
         0                   4                 0

Đối chiếu của tôi dường như phân biệt chữ hoa chữ thường, dựa trên những kết quả này. Hai chuỗi còn lại buộc phải đối sánh không phân biệt chữ hoa chữ thường và phân biệt chữ hoa chữ thường.

Subexpressions

Dưới đây là một ví dụ về việc sử dụng đối số thứ sáu để trả về một mẫu biểu thức con cụ thể:

SELECT REGEXP_INSTR(
    'catdogcow', 
    '(c.t)(d.g)(c.w)', 
    1, 1, 0, 'i', 1
    )
FROM DUAL;

Kết quả:

1

Trong trường hợp này, tôi đã trả lại biểu thức con đầu tiên.

Đây là những gì sẽ xảy ra nếu tôi chỉ định biểu thức con thứ ba:

SELECT REGEXP_INSTR(
    'catdogcow', 
    '(c.t)(d.g)(c.w)', 
    1, 1, 0, 'i', 3
    )
FROM DUAL;

Kết quả:

7

Đối số rỗng

Ngoại trừ đối số thứ 6, cung cấp null đối với một đối số dẫn đến 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;

Kết quả:

      1       2       3       4       5    6       7 
_______ _______ _______ _______ _______ ____ _______ 
   null    null    null    null    null    0    null 

Theo mặc định, SQLcl và SQL * Plus trả về một khoảng trống bất cứ khi nào null xảy ra do một SELECT trong SQL tuyên bố.

Tuy nhiên, bạn có thể sử dụng SET NULL để chỉ định một chuỗi khác được trả về. Ở đây tôi đã chỉ định rằng chuỗi null nên được trả lại.

Số lượng đối số sai

Không chuyển đối số nào cho hàm hoặc quá ít, dẫn đến lỗi:

SELECT REGEXP_INSTR()
FROM DUAL;

Kết quả:

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:

Điều tương tự cũng áp dụng khi chúng ta chuyển quá nhiều đối số:

SELECT REGEXP_INSTR('Cat', 'c.t', 1, 1, 1, 'i', 1, 'oops')
FROM DUAL;

Kết quả:

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:

Thông tin thêm

REGEXP_INSTR() hàm (cũng như cách triển khai các biểu thức chính quy khác của Oracle) tuân theo tiêu chuẩn biểu thức chính quy IEEE Portable Operating System Interface (POSIX) và các Nguyên tắc về Cụm từ Thông dụng Unicode của Unicode Consortium.

Xem tài liệu Oracle để biết thêm thông tin và ví dụ về REGEXP_INSTR() chức năng.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Vòng lặp lồng nhau Tham gia vào Oracle 11g

  2. Làm cách nào để đặt đúng biến ORACLE_HOME trên Ubuntu 9.x?

  3. Truy vấn hai bảng từ các giản đồ khác nhau

  4. Làm thế nào để gỡ lỗi ORA-01775:lặp lại chuỗi từ đồng nghĩa?

  5. Sự khác biệt chính giữa Varchar2 và char là gì