MariaDB 正则表达式

MariaDB REGEXP_INSTR() 函数返回给定字符串中正则表达式模式的起始索引。如果没有匹配则返回 0。如果字符串或模式为NULL,则返回值为NULL。字符索引从 1 开始。

REGEXP_INSTR() 函数执行不区分大小写的匹配,除非与二进制字符串一起使用。

语法

REGEXP_INSTR(string, pattern) 

    参数

    string 必需。 指定要搜索的字符串。
    pattern 必填。 指定正则表达式匹配信息。请参阅下表了解模式语法。

    正则表达式模式

    符号 描述
    ^ 匹配字符串的开头。
    $ 匹配字符串的结尾字符串。
    * 匹配零次或多次出现。
    + 匹配一次或多次出现。
    ? 匹配零次或一次出现。
    . 匹配除 NULL 之外的任何字符。
    | 像"OR"一样使用来指定多个替代字符。
    [ ] 匹配 [] 内指定的任何单个字符。
    [^ ] 匹配 [] 内未指定的任何单个字符。
    - 表示字符范围。
    ( ) 用于将表达式分组为子表达式。
    {m} 匹配 m
    {m,} 匹配至少 m 次。
    {m,n} 匹配至少 m 次,但不超过 n 次。
    \n n 是 1 到 9 之间的数字。匹配找到的第 n 个子表达式在 ( ) 内遇到 \n 之前。
    \d 匹配数字字符。
    \D 匹配非数字字符。
    \w 匹配单词字符。
    \W 匹配非单词字符。
    \s 匹配空白字符。
    \s 匹配空白字符。
    \S 匹配非空白字符。
    *? 匹配前面的模式出现零次或多次。
    +? 匹配前面的模式出现一次或多次。
    ?? 匹配前面的模式零次或一次出现。
    ? 匹配前面的模式n 次。
    ? 与前面的模式匹配至少 n 次。
    ? 匹配前面的模式至少 n 次,但不超过 m 次。
    [..] 匹配一种排序规则可以是多个字符的元素。
    [=character_class=] 表示一个等价类。它匹配具有相同排序值的所有字符,包括其自身。
    [:character_class:] 表示匹配属于该字符的所有字符的字符类

    标准类列表名称

    字符类名称 含义
    alnum 字母数字字符
    alpha 字母字符
    blank 空白字符
    cntrl 控制字符
    digit 数字字符
    graph 图形字符
    lower 小写字母字符
    print 图形或空格字符
    punct 标点符号
    space 空格、制表符、换行符和回车符
    upper 大写字母字符
    xdigit 十六进制数字字符

    示例:REGEXP_INSTR() 示例

    下面的示例显示了REGEXP_INSTR()函数的用法.

    SELECT REGEXP_INSTR('dog cat dog', 'dog');
    Result: 1
    
    SELECT REGEXP_INSTR('aa aaa aaaa', 'a{2}');
    Result: 1
    
    SELECT REGEXP_INSTR('aa aaa aaaa', 'a{4}');
    Result: 8 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    示例:区分大小写搜索

    使用此功能时,MariaDB 中有很多方法可以用于区分大小写搜索。请参阅下面的示例:

    SELECT REGEXP_INSTR('ABC','b');
    Result: 2
    
    /* 使用 COLLATE 将字符串转换为二进制字符串 */
    SELECT REGEXP_INSTR('ABC' COLLATE utf8_bin,'b');
    Result: 0
    
    /* 使用 BINARY 将字符串转换为二进制字符串 */
    SELECT REGEXP_INSTR(BINARY'ABC','b');
    Result: 0
    
    /* 使用 (?-i) 模式强制区分大小写 */
    SELECT REGEXP_INSTR('ABC','(?-i)b');
    Result: 0
    
    /* 强制搜索不区分大小写 */
    SELECT REGEXP_INSTR('ABC' COLLATE utf8_bin,'(?i)b');
    Result: 2
    
    /* 强制搜索不区分大小写 */
    SELECT REGEXP_INSTR('ABC' COLLATE utf8_bin,'(?+i)b');
    Result: 2 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    示例:匹配多个替代项

    考虑一个名为 Employee 的数据库表,其中包含以下记录:

    EmpID Name City Age Salary
    1 John London 25 3000
    2 Marry New York 24 2750
    3 Jo Paris 27 2800
    4 Smith Amsterdam 30 3100
    5 Aman New Delhi 28 3000

    下面的查询用于获取Name列记录中元音第一次出现的位置。要在模式中指定多个替代方案,请使用 |

    SELECT *, 
    REGEXP_INSTR(Name, 'a|e|i|o|u') AS first_occurrence
    FROM Employee 
    • 1
    • 2

    这将产生类似于以下内容的结果:

    EmpID Name City Age Salary first_occurrence
    1 John London 25 3000 2
    2 Marry New York 24 2750 2
    3 Jo Paris 27 2800 2
    4 Smith Amsterdam 30 3100 3
    5 Aman New Delhi 28 3000 1

    示例:匹配多个字符

    考虑上面讨论的表格。下面的查询用于获取City列的记录中第一次出现"ar"或"er"(以先到者为准)的位置。要在模式中指定多个替代方案,请使用[  ]

    SELECT *, 
    REGEXP_INSTR(City, '[ae]r') AS first_occurrence
    FROM Employee 
    • 1
    • 2

    这将产生类似于以下内容的结果:

    EmpID Name City Age Salary first_occurrence
    1 John London 25 3000 0
    2 Marry New York 24 2750 0
    3 Jo Paris 27 2800 2
    4 Smith Amsterdam 30 3100 5
    5 Aman New Delhi 28 3000 0

    示例:使用多字节字符

    将多字节字符集转换为 BINARY 对于获取字节偏移量非常有用。请参见下面的示例:

    SELECT REGEXP_INSTR('BJÖRN','N');
    Result: 5
    
    /* 使用 BINARY 将字符串转换为二进制字符串 */
    SELECT REGEXP_INSTR(BINARY 'BJÖRN','N');
    Result: 6 
    • 1
    • 2
    • 3
    • 4
    • 5