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

Hàm REGEXP_REPLACE () trong Oracle

Trong Oracle, REGEXP_REPLACE() hàm thay thế các lần xuất hiện của chuỗi con trong một chuỗi khớp với mẫu biểu thức chính quy đã cho.

Nó mở rộng chức năng của REPLACE() 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_REPLACE ( source_char, pattern
                 [, replace_string
                    [, position
                       [, occurrence
                          [, match_param ]
                       ]
                    ]
                 ]
               )

Ở đâ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.
  • replace_string là chuỗi thay thế.
  • 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 không âm xác định sự xuất hiện nào cần thay thế. Giá trị mặc định là 0 , nghĩa là thay thế tất cả các lần xuất hiện.
  • 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 để biết thêm thông tin.

Ví dụ

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

SELECT 
    REGEXP_REPLACE('Cats and dogs', 'd.g', 'bird')
FROM DUAL;

Kết quả:

Cats and birds

Trong trường hợp này, có một kết quả khớp và chuỗi con được thay thế bằng chuỗi thay thế.

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_REPLACE() 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_REPLACE('Cats and dogs', 't.g', 'bird');

Kết quả:

+------------------------------------------------+
| REGEXP_REPLACE('Cats and dogs', 't.g', 'bird') |
+------------------------------------------------+
| Cats and dogs                                  |
+------------------------------------------------+

Không có kết quả khớp nào, vì vậy chuỗi gốc được trả về không thay đổi.

Nhiều Kết hợp

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

SELECT 
    REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird')
FROM DUAL;

Kết quả:

My bird likes other birds

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

SELECT 
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 1, 2)
FROM DUAL;

Kết quả:

My dog likes other birds

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 để thay thế. Trong trường hợp này, lần xuất hiện thứ hai được thay thế.

Đâ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_REPLACE('My dog likes other dogs', 'd.g', 'bird', 7, 2)
FROM DUAL;

Kết quả:

My dog likes other dogs

Trong trường hợp này, chuỗi không được cập nhật vì chỉ có một lần xuất hiện nữa sau vị trí bắt đầu.

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

SELECT 
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 7, 1)
FROM DUAL;

Kết quả:

My dog likes other birds

Và trong trường hợp bạn đang thắc mắc, hãy 0 chỉ định tất cả các lần xuất hiện:

SELECT REGEXP_REPLACE(
    'My dog likes big dogs and small dogs', 
    'd.g', 
    'bird', 1, 0
    )
FROM DUAL;

Kết quả:

My bird likes big birds and small birds

Nhưng nó vẫn tôn trọng mọi vị trí bắt đầu đã được chỉ định:

SELECT REGEXP_REPLACE(
    'My dog likes big dogs and small dogs', 
    'd.g', 
    'bird', 7, 0
    )
FROM DUAL;

Kết quả:

My dog likes big birds and small birds

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

REGEXP_REPLACE() 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_REPLACE('My Cats', 'c.t', 'dog', 1, 0) AS "Default",
    REGEXP_REPLACE('My Cats', 'c.t', 'dog', 1, 0, 'i') AS "Case Insensitive",
    REGEXP_REPLACE('My Cats', 'c.t', 'dog', 1, 0, 'c') AS "Case Sensitive"
FROM DUAL;

Kết quả:

   Default    Case Insensitive    Case Sensitive 
__________ ___________________ _________________ 
My Cats    My dogs             My Cats         

Từ các kết quả này có vẻ như đối chiếu mặc định của tôi là phân biệt chữ hoa chữ thường. 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.

Đối số rỗng

Chuyển null kết quả là null cho hầu hết các đối số, ngoại trừ đối số thứ hai và thứ sáu:

SET NULL 'null';
SELECT 
    REGEXP_REPLACE(null, 'c.t', 'dog', 1, 0, 'i') AS "1",
    REGEXP_REPLACE('Cat', null, 'dog', 1, 0, 'i') AS "2",
    REGEXP_REPLACE('Cat', 'c.t', null, 1, 0, 'i') AS "3",
    REGEXP_REPLACE('Cat', 'c.t', 'dog', null, 0, 'i') AS "4",
    REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, null, 'i') AS "5",
    REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, 0, null) AS "6"
FROM DUAL;

Kết quả:

      1      2       3       4       5      6 
_______ ______ _______ _______ _______ ______ 
null    Cat    null    null    null    Cat   

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_REPLACE()
FROM DUAL;

Kết quả:

Error starting at line : 1 in command -
SELECT REGEXP_REPLACE()
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:

Tương tự với việc chuyển quá nhiều đối số:

SELECT REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, 0, 'i', 'oops')
FROM DUAL;

Kết quả:

Error starting at line : 1 in command -
SELECT REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, 0, 'i', '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_REPLACE() 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_REPLACE() 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. Chọn hàng đầu tiên của mỗi nhóm trong sql

  2. Lý do / hữu ích là gì khi sử dụng từ khóa ENABLE trong các câu lệnh cơ sở dữ liệu oracle

  3. java.sql.SQLException:I / O Error:Thiết lập lại kết nối trong máy chủ linux

  4. Cơ sở dữ liệu Oracle được xây dựng sẵn để học và thử nghiệm bằng Oracle Developer VM

  5. Tôi có thể sao chép:Bản ghi giả CŨ và:MỚI vào / vào một thủ tục được lưu trữ Oracle không?