MySQL - REGEXP_INSTR() 函式



MySQL 支援各種型別的模式匹配操作,以從大型資料庫表中檢索過濾後的結果集。但是,使用正則表示式進行模式匹配是一種執行復雜搜尋的強大方法。

正則表示式在技術上被定義為表示輸入文字中模式的字元序列。它用於使用某些模式定位或替換文字字串;此模式可以是單個字元、多個字元或單詞等。

MySQL 中的這些正則表示式提供了各種函式和運算子來輕鬆執行搜尋操作。其中一個函式是regexp_instr()函式。

MySQL REGEXP_INSTR() 函式

MySQL regexp_instr() 函式用於將指定的模式與字串或資料庫表中的資料進行匹配。如果存在匹配,此函式返回字串匹配指定模式的子字串的起始索引,如果不存在匹配,則返回 0,如果字串或模式為 NULL,則返回 NULL。此字串的字元索引從 1 開始。

語法

以下是 MySQL regexp_instr() 函式的語法:

REGEXP_INSTR(expr, pattern[, pos[, occurrence[, return_option[, match_type]]]])

其中expr是要執行搜尋的字串,pat是要搜尋的模式/正則表示式。除了表示式和字串值之外,此方法還接受以下可選引數。

引數

regexp_instr() 函式採用以下引數值:

  • expr: 執行搜尋的字串

  • pattern: 在字串中搜索的模式

以下是可以傳遞給此函式的可選引數:

  • pos: 在 expr 中開始搜尋的位置。如果省略,則預設為 1。

  • occurrence: 要搜尋的匹配的哪個出現次數。如果省略,則預設為 1。

  • return_option: 要返回哪種型別的職位。如果此值為 0,則 REGEXP_INSTR() 返回匹配子字串的第一個字元的位置。如果此值為 1,則 REGEXP_INSTR() 返回匹配子字串後的位置。如果省略,則預設為 0。

  • match_type:這是一個由表示所需匹配特徵的各種字元組成的字串,它可以包含一個或所有這些字元。以下是您可以使用各種字元指定匹配型別的字元。

    • c 此字元表示區分大小寫的匹配。

    • i 此字元表示不區分大小寫的匹配。

    • m 此字元表示即單個字串中的多行(以行終止符分隔)被識別。

    • n 如果指定此字元,則點 (.) 字元匹配行終止符。

    • u 如果指定此字元,則只有換行符被 ., ^ 和 $ 識別為行結束符。

示例

在此示例中,我們使用 MySQL REGEXP_INSTR() 函式對簡單字串執行搜尋操作:

SELECT REGEXP_INSTR('Welcome To Tutorialspoint!', 'To') AS RESULT;

模式“To”在第 9 個索引處找到:

結果
9

如果在字串中找不到匹配項,則返回值將為“0”:

SELECT REGEXP_INSTR('Welcome To Tutorialspoint!', 'xx') AS RESULT;

以下是輸出:

結果
0

示例

讓我們也向此函式傳遞可選引數並觀察結果。在這裡,搜尋搜尋位置從 5 開始,以查詢該位置之後“T”的第二個出現次數。由於返回值選項設定為 1,因此返回匹配後的位置。

SELECT REGEXP_INSTR('Welcome To Tutorialspoint!', 'T', 5, 2, 1) AS RESULT;

輸出

以下是輸出:

結果
13

示例

以下查詢在提供的字串“9848032919”中搜索任何字母字元的位置。如果找到,則返回 1。否則,返回 0。

SELECT REGEXP_INSTR('9848032919', '[[:alpha:]]');

輸出

執行上述查詢將產生以下輸出:

REGEXP_INSTR('9848032919', '[[:alpha:]]')
0

示例

以下查詢搜尋提供的字串中“town”或“city”的位置:

SELECT REGEXP_INSTR('Vishakapatnam is city of destiny ', 'town|city')
As Result;

輸出

上述查詢的輸出如下所示:

結果
0

示例

如果傳遞給此函式的前兩個引數中的任何一個為 NULL,則此函式返回 NULL。在這裡,我們傳遞“NULL”作為搜尋模式。

SELECT REGEXP_INSTR('Tutorialspoint', NULL) 
As Result;

如果我們編譯並執行該查詢,則結果如下所示:

結果
NULL

在下面的查詢中,我們將 'NULL' 傳遞給字串引數。

SELECT REGEXP_INSTR(NULL, 'to') 
As Result;

當我們執行上面的查詢時,輸出如下所示:

結果
NULL

示例

在另一個示例中,讓我們使用 REGEXP_INSTR() 函式對名為 **CUSTOMERS** 的資料庫表執行搜尋操作。首先,讓我們使用以下查詢建立表:

CREATE TABLE CUSTOMERS (
   ID INT AUTO_INCREMENT,
   NAME VARCHAR(20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

使用以下 INSERT 查詢將一些記錄插入到上面建立的表中:

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES 
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'Hyderabad', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

執行以下查詢以顯示 CUSTOMERS 表中存在的所有記錄:

Select * from CUSTOMERS;

以下是 CUSTOMERS 表:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

以下查詢選擇從 CUSTOMERS 表的 NAME 列中以字母 'K' 開頭的字串的第一次出現的職位:

SELECT REGEXP_INSTR(NAME, '^K') 
AS RESULT FROM CUSTOMERS;

正如我們在下面的輸出中看到的,NAME 列中有三個以字母 K 開頭的字串。

結果
0
1
1
0
0
1
0

客戶端程式

我們還可以使用客戶端程式(例如 PHP、Node.js、Java、Python)執行 MySQL REGEXP_INSTR() 函式,以將指定的模式與字串或資料庫表中的資料匹配。

語法

以下是各種程式語言中此操作的語法:

要檢索與特定模式匹配的 MySQL 資料庫中的所有記錄(無論是字串還是資料),透過 PHP 程式,我們使用 **mysqli** 函式 **query()** 執行 'SELECT' 語句,如下所示:

$sql = "SELECT REGEXP_INSTR('Welcome To Tutorialspoint!', 'To') AS RESULT";
$mysqli->query($sql);

要檢索與特定模式匹配的 MySQL 資料庫中的所有記錄(無論是字串還是資料),透過 Node.js 程式,我們使用 **mysql2** 庫的 **query()** 函式執行 'SELECT' 語句,如下所示:

sql = "SELECT REGEXP_INSTR('Welcome To Tutorialspoint!', 'To') AS RESULT";
con.query(sql);

要檢索與特定模式匹配的 MySQL 資料庫中的所有記錄(無論是字串還是資料),透過 Java 程式,我們使用 **JDBC** 函式 **executeUpdate()** 執行 'SELECT' 語句,如下所示:

String sql = "SELECT REGEXP_INSTR('Welcome To Tutorialspoint!', 'To') AS RESULT";
statement.executeQuery(sql);

要檢索與特定模式匹配的 MySQL 資料庫中的所有記錄(無論是字串還是資料),透過 Python 程式,我們使用 MySQL **Connector/Python** 的 **execute()** 函式執行 'SELECT' 語句,如下所示:

sql = "SELECT REGEXP_INSTR('Welcome To Tutorialspoint!', 'To') AS RESULT" 
cursorObj.execute(sql)

示例

以下是程式:

$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'password';
$db = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $db);
if ($mysqli->connect_errno) {
    printf("Connect failed: %s
", $mysqli->connect_error); exit(); } //printf('Connected successfully.
'); $sql = "SELECT REGEXP_INSTR('Welcome To Tutorialspoint!', 'To') AS RESULT"; if($result = $mysqli->query($sql)){ while($row = mysqli_fetch_array($result)){ printf("Result: %d", $row['RESULT']); } } if($mysqli->error){ printf("Error message: ", $mysqli->error); } $mysqli->close();

輸出

獲得的輸出如下所示:

Result: 9      
var mysql = require('mysql2');
var con = mysql.createConnection({
host:"localhost",
user:"root",
password:"password"
});
 //Connecting to MySQL
 con.connect(function(err) {
 if (err) throw err;
  //console.log("Connected successfully...!");
  //console.log("--------------------------");
 sql = "USE TUTORIALS";
 con.query(sql);
 sql = "SELECT REGEXP_INSTR('Welcome To Tutorialspoint!', 'To') AS RESULT";
 console.log("Select query executed successfully..!");
 console.log("Table records: ");
 con.query(sql);
 con.query(sql, function(err, result){
 if (err) throw err;
 console.log(result);
 });
});    

輸出

產生的輸出如下所示:

Select query executed successfully..!
Table records:
[ { RESULT: 9 } ]       
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class regexp_instr {
    public static void main(String[] args) {
        String url = "jdbc:mysql://:3306/TUTORIALS";
        String user = "root";
        String password = "password";
        ResultSet rs;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            Connection con = DriverManager.getConnection(url, user, password);
            Statement st = con.createStatement();
            //System.out.println("Database connected successfully...!");
            String sql = "SELECT REGEXP_INSTR('Welcome To Tutorialspoint!', 'To') AS RESULT";
            rs = st.executeQuery(sql);
                  while(rs.next()) {
                String result = rs.getString("RESULT");
                System.out.println("Result: " + result);
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}    

輸出

獲得的輸出如下所示:

Result: 9
import mysql.connector
# Establishing the connection
connection = mysql.connector.connect(
    host='localhost',
    user='root',
    password='password',
    database='tut'
)
# Creating a cursor object
cursorObj = connection.cursor()
regexp_instr_query = f"SELECT REGEXP_INSTR('Welcome To Tutorialspoint!', 'To') AS RESULT"
cursorObj.execute(regexp_instr_query)
# Fetching all the results
results = cursorObj.fetchall()
# Display the result
print("Result of REGEXP_INSTR() Function:")
for row in results:
    position = row[0]
    if position > 0:
        print(f"The pattern 'To' found at position {position}")
    else:
        print("The pattern 'To' not found in the given string")
cursorObj.close()
connection.close()    

輸出

以下是上述程式碼的輸出:

Result of REGEXP_INSTR() Function:
The pattern 'To' found at position 9
廣告