MariaDB 函数

MariaDB REGEXP_REPLACE() 函数替换 string 中与 pattern 指定的正则表达式匹配的所有匹配项替换字符串replace,并返回结果字符串。如果字符串或模式为NULL,则返回值为NULL。

替换字符串可以对子表达式进行反向引用,格式为\N ,其中 N 是 1 到 9 之间的数字。

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

语法

REGEXP_REPLACE(string, pattern, replace) 

    参数

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

    正则表达式模式

    符号描述
    ^匹配字符串的开头。
    $匹配字符串的结尾字符串。
    *匹配零次或多次出现。
    +匹配一次或多次出现。
    ?匹配零次或一次出现。
    .匹配除 NULL 之外的任何字符。
    |像"OR"一样使用来指定多个替代字符。
    [ ]匹配 [] 内指定的任何单个字符。
    [^ ]匹配 [] 内未指定的任何单个字符。
    -表示字符范围。
    ( )用于将表达式分组为子表达式。
    {m}匹配 m
    {m,}匹配至少 m 次。
    {m,n}匹配至少 m 次,但不超过 n 次。
    \nn 是 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_REPLACE()示例

    下面的示例显示了REGEXP_REPLACE()的用法

    SELECT REGEXP_REPLACE('a b c', 'b', 'X');
    Result: 'a X c'
    
    REGEXP_REPLACE('James Bond','^(.*) (.*)$','\\2, \\1');
    Result: 'Bond, James'
    
    SELECT REGEXP_REPLACE('abc123ghi', '[0-9]+', '');
    Result: 'abcghi'
    
    SELECT REGEXP_REPLACE('<html><head><title>title</title><body>body</body></htm>', '','');
    Result: 'titlebody' 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    示例:区分大小写的替换

    MariaDB中有很多方法可以在使用此函数时进行区分大小写的替换。请参阅下面的示例:

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

    示例:匹配多个替代项

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

    EmpIDNameCityAge
    1John SmithLondon25
    2Marry KnightNew York24
    3Jo WilliamsParis27
    4Smith FischerAmsterdam30
    5Aman GuptaNew Delhi28

    下面的查询用于将City列记录中的所有元音替换为"@"。要在模式中指定多个替代方案,请使用 |

    SELECT *, 
    REGEXP_REPLACE(City, 'a|e|i|o|u', '@') AS Replaced_City
    FROM Employee 
    • 1
    • 2

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

    EmpIDNameCityAgeReplaced_City
    1John SmithLondon25L@nd@n
    2Marry KnightNew York24N@w Y@rk
    3Jo WilliamsParis27P@r@s
    4Smith FischerAmsterdam30@mst@rd@m
    5Aman GuptaNew Delhi28N@w D@lh@

    示例:单词匹配

    考虑上面讨论的表格。以下查询用于将 Name 列中的第一个单词(名字)替换为"Mr."。要指定字符范围,请使用 [  ]

    SELECT *, 
    REGEXP_REPLACE(Name, '^(.*) (.*)$', 'Mr. \\1') AS ReplacedName
    FROM Employee 
    • 1
    • 2

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

    EmpIDNameCityAgeReplacedName
    1John SmithLondon25Mr. John
    2Marry KnightNew York24Mr. Marry
    3Jo WilliamsParis27Mr. Jo
    4Smith FischerAmsterdam30Mr. Snith
    5Aman GuptaNew Delhi28Mr. Aman