Hàm Hàm REGEXP_INSTR trong Oracle
Trong bài này chúng ta sẽ tìm hiểu một hàm rất hay dùng để xử lý chuỗi nâng cao dựa vào chuỗi pattern, đó là hàm REGEXP_INSTR. hàm này có công dụng là tìm một chuỗi con nằm trong chuỗi cha dựa vào mẫu so khớp pattern, hay còn gọi là mẫu Regular Expression.
1. Cú pháp hàm REGEXP_INSTR trong Oracle
Hàm này rất hữu ích bởi nó cho phép bạn tìm những chuỗi con có tính phức tạp, cú pháp của nó như sau.
Cú pháp
REGEXP_INSTR( STRING, pattern [, start_position [, nth_appearance [, return_option [, match_parameter [, s ub_expression ] ] ] ] ] )
Trong đó:
- string là chuỗi cha, nghĩa là chuỗi cần tìm chuỗi con trong đó
- pattern là mẫu so khớp, bạn có thể xem danh sách mẫu so khớp phía dưới đây.
Value Description ^ Matches the beginning of a string. If used with a match_parameter of 'm', it matches the start of a line anywhere within expression. $ Matches the end of a string. If used with a match_parameter of 'm', it matches the end of a line anywhere within expression. * Matches zero or more occurrences. + Matches one or more occurrences. ? Matches zero or one occurrence. . Matches any character except NULL. | Used like an "OR" to specify more than one alternative. [ ] Used to specify a matching list where you are trying to match any one of the characters in the list. [^ ] Used to specify a nonmatching list where you are trying to match any character except for the ones in the list. ( ) Used to group expressions as a subexpression. {m} Matches m times. {m,} Matches at least m times. {m,n} Matches at least m times, but no more than n times. \n n is a number between 1 and 9. Matches the nth subexpression found within ( ) before encountering \n. [..] Matches one collation element that can be more than one character. [::] Matches character classes. [==] Matches equivalence classes. \d Matches a digit character. \D Matches a nondigit character. \w Matches a word character. \W Matches a nonword character. \s Matches a whitespace character. \S matches a non-whitespace character. \A Matches the beginning of a string or matches at the end of a string before a newline character. \Z Matches at the end of a string. *? Matches the preceding pattern zero or more occurrences. +? Matches the preceding pattern one or more occurrences. ?? Matches the preceding pattern zero or one occurrence. {n}? Matches the preceding pattern n times. {n,}? Matches the preceding pattern at least n times. {n,m}? Matches the preceding pattern at least n times, but not more than m times. - start_position là vị trí bắt đầu tìm, nếu không truyền vào thì nó sẽ bắt đàu từ vị trí đầu tiên.
- nth_appearance là thứ xuất hiện thứ mấy trong chuỗi, ví dụ bạn nhập số 2 thì nó sẽ tìm vị trí của chuỗi con xuất hiện lần thứ hai.
- return_option là không bắt buộc, nó có hai giá trị là 0 hoặc 1 và mặc định là 0. Nếu sử dụng giá trị 0 thì sẽ trả về vị trí của ký tự đầu tiên, nếu là 1 thì sẽ trả về vị trí của kí tự kế liền với chuỗi so khớp, nghĩa là kí tự tiếp theo.
- match_parameter là tham số khai báo mưc độ ảnh hưởng.
Value Description 'c' Perform case-sensitive matching. 'i' Perform case-insensitive matching. 'n' Allows the period character (.) to match the newline character. By default, the period is a wildcard. 'm' expression is assumed to have multiple lines, where ^ is the start of a line and $ is the end of a line, regardless of the position of those characters in expression. By default, expression is assumed to be a single line. 'x' Whitespace characters are ignored. By default, whitespace characters are matched like any other character. - subexpression được sử dụng khi mẫu có biểu thức con và bạn muốn chỉ ra biểu thức con nào trong mẫu là đích trả về. Nó sẽ có giá trị từ 1 đến 9.
Return
Hàm này trả về vị trí xuất hiện của chuỗi con theo thông số cấu hình của hàm.
Bài viết này được đăng tại [free tuts .net]
Version
Hàm này chỉ sử dụng được ở các phiên bản sau:
- Oracle 12c, Oracle 11g, Oracle 10g
2. Ví dụ hàm REGEXP_INSTR trong Oracle
Sau đây là một vài ví dụ cách sử dụng hàm này, nó hơi phức tạp nên bạn phải thực hành theo mới hiểu được. Nếu bạn chưa biết qua Regex thì cũng là một bất tiện khi học bài này.
Ví dụ: Tìm vị trí xuất hiện của chữ t đầu tiên trong chuỗi.
SELECT REGEXP_INSTR ('Freetuts is a great resource', 't') FROM message; Result: 5
Trong ví dụ này sẽ trả về 5 tại vì chữ t xuất hiện tại vị trí thứ 5 trong chuỗi freetuts.
Ví dụ 2: Tìm vị trị xuất hiện chữ r khôn phân biệt hoa thường trong chuỗi.
SELECT REGEXP_INSTR ('FReetuts is a great resource', 'r', 1, 1, 0, 'i') FROM message; Result: 2
Ví dụ này sẽ trả về 2, tại vì theo thông số cấu hình là không phân biệt hoa thường.
Ví dụ 3: Tìm vị trí xuất hiện chữ a hoặc b hoặc s không phân biệt hoa thường.
SELECT REGEXP_INSTR ('Freetuts is a great resource', 'a|b|s', 1, 1, 0, 'i') FROM message; Result: 8
Mình đã dùng dấu | để dại diện cho toán tử OR.
Như vậy mình đã giải thích sơ lược về công dụng của hàm REGEXP_INSTR trong Oracle, đây quả thực là rất khó với những bạn không biết lập trình, còn những bạn rành lập trình thì nó rất đơn giản bởi biểu thức chính quy quá quen thuộc đối với họ.