更新时间:2024-12-13 GMT+08:00
分享

正则表达式函数

概述

所有的正则表达式函数都使用Java样式的语法。但以下情况除外:

  • 使用多行模式(通过(?m)标志启用)时,只有\ n被识别为行终止符。 此外,不支持(?d)标志,因此不能使用。
  • 大小写区分模式(通过(?i)标志启用)时,总是以unicode的模式去实现。同时,不支持上下文敏感匹配和局部敏感匹配。此外,不支持(?u)标志。
  • 不支持Surrogate Pair编码方式。例如,\ uD800 \ uDC00不被视为U + 10000,必须将其指定为\ x {10000}。
  • 边界字符(\b)无法被正确处理,因为它一个不带基字符的非间距标记。
  • \Q和\E在字符类(如[A-Z123])中不受支持,而是作为文本处理。
  • 支持Unicode字符类(\ p {prop}),但有以下差异:
    • 名称中的所有下划线都必须删除。例如,使用OldItalic而不是Old_Italic
    • 必须直接指定脚本,不能带Is,script =或sc =前缀。示例:\ p {Hiragana}
    • 必须使用In前缀指定块。不支持block =和blk =前缀。示例:\p{Mongolian}
    • 必须直接指定类别,而不能带Is,general_category =或gc =前缀。示例:\p{L}
    • 二进制属性必须直接指定,而不是Is。示例:\p{NoncharacterCodePoint}

函数

  • regexp_count(string, pattern) → bigint

    描述:返回字符串中pattern匹配的次数。

    SELECT regexp_count('1a 2b 14m', '\s*[a-z]+\s*'); -- 3
  • regexp_extract_all(string, pattern) -> array(varchar)

    描述:以数组格式返回匹配的所有子串。

    SELECT regexp_extract_all('1a 2b 14m','\d+');-- [1, 2, 14]
  • regexp_extract_all(string, pattern, group) -> array(varchar)

    描述:当pattern包含多个分组时,用group指定返回满足被捕获分组的所有子串。

    SELECT regexp_extract_all('1a 2b 14m','(\d+)([a-z]+)',2);-- [a, b, m]
  • regexp_extract(string, pattern) → varchar

    描述:返回与字符串中的正则表达式模式匹配的第一个子字符串。

    SELECT regexp_extract('1a 2b 14m','\d+');-- 1
  • regexp_extract(string, pattern, group) → varchar

    描述:当pattern包含多个分组时,用group指定返回满足被捕获分组的第一个子字符串。

    SELECT regexp_extract('1a 2b 14m','(\d+)([a-z]+)',2);-- 'a'
  • regexp_like(string, pattern) → boolean

    描述:验证字符串是否包含满足正则表达式的子串,如果有,返回true。

    SELECT regexp_like('1a 2b 14m','\d+b');-- true
  • regexp_position(string, pattern) → integer

    描述:返回字符串中pattern第一次匹配到的索引。没有匹配的项则返回-1。

    SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges', '\b\d+\b'); -- 8
  • regexp_position(string, pattern, start) → integer

    描述:返回字符串从start(含start)开始pattern第一次匹配到的项的索引。没有匹配的项则返回-1。

    SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges', '\b\d+\b', 5); -- 8
    SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges', '\b\d+\b', 12); -- 19
  • regexp_position(string, pattern, start, occurrence) → integer

    描述:返回字符串中从索引start(含start)开始,pattern第occurrence次匹配到的项的索引。没有匹配的项则返回-1。

    SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges','\b\d+\b',12,1);-- 19
    SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges','\b\d+\b',12,2);-- 31
    SELECT regexp_position('I have 23 apples, 5 pears and 13 oranges','\b\d+\b',12,3);-- -1
  • regexp_replace(string, pattern) → varchar

    描述:从目标字符串中移除满足正则表达式的子串。

    SELECT regexp_replace('1a 2b 14m','\d+[ab] ');-- '14m'
  • regexp_replace(string, pattern, replacement) → varchar

    描述:使用replacement替换目标字符串中满足正则表达式的子串。如果replacement中包含'$'字符,使用'\$' 进行转义。在替换中,可以对编号组使用$g引用捕获组,对命名组使用${name}引用捕获组。

    SELECT regexp_replace('1a 2b 14m','(\d+)([ab]) ','3c$2 ');-- '3ca 3cb 14m'
  • regexp_replace(string, pattern, function) → varchar

    描述:使用function替换与字符串中的正则表达式模式匹配的子字符串的每个实例。对于每个匹配,以数组形式传递的捕获组都会调用lambda表达式函数。捕获组号从1开始;整个匹配没有分组(如果需要,请用括号将整个表达式括起来)。

    SELECT regexp_replace('new york','(\w)(\w*)',x->upper(x[1])||lower(x[2]));--'New York'
  • regexp_split(string, pattern) -> array(varchar)

    描述:使用正则表达式模式拆分字符串并返回一个数组。尾随的空字符串被保留。

    SELECT regexp_split('1a 2b 14m','\s*[a-z]+\s*');-- [1, 2, 14, ]

相关文档