
# 正则表达式函数
#### 概述
所有的正则表达式函数都使用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指定返回满足[被捕获分组](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#cg)的所有子串。
  ```
  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指定返回满足[被捕获分组](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#cg)的第一个子字符串。
  ```
  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替换与字符串中的正则表达式模式匹配的子字符串的每个实例。对于每个匹配，以数组形式传递的[捕获组](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#cg)都会调用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, ]
  ```
  
 
