大家好,又见面了,我是你们的朋友全栈君。
regexp_replace:
- 官方内容:
官方语法:
官方说明:
https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions130.htm
regexp_replace函数是replace函数的扩展函数,用于通过正则表达式来进行匹配替换,默认情况下,每次匹配到的正则,都替换为replace_string,返回的字符串与source_char字符集相同。如果source_char为非LOB类型,则返回varchar2数据类型,如果为LOB类型,则返回CLOB类型,该函数符合POSIX正则和Unicode正则。
-
source_char是一个用作搜索的值,它通常是一种字符列,可以以下是任何数据类型CHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOB、NCLOB
-
pattern是正则表达式,可以是以下任意数据类型CHAR、VARCHAR2、NCHAR、NVARCHAR2。最多可包含512个字节。如果pattern数据类型与source_char异同,则Oracle将转换pattern的数据类型与source_char的一致。
-
replace_string可以是以下任意数据类型CHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOB、NCLOB。如果replace_string是CLOB或NCLOB,则Oracle截断replace_string为32K。replace_string可含有多达500个反向引用作为子表达式,其形式为\n,n为数字1~9。如果n在replace_string中为反斜线字符,则需使用转移字符在其前面(\)
-
position是一个正整数,表示在source_char中Oracle应该开始搜索的字符。默认值为1,表示Oracle以第一个字符开始搜索。
-
occurrence是一个非负整数,表示替换动作的发生,如果为0,则Oracle将替换所有匹配项,如果为正整数n,则Oracle将替换第n个匹配项。
-
match_parameter是一个文本文件,用于更改匹配行为,仅影响匹配过程,并不影响replace_string。可以指定以下一个或多个值:
‘i’指定不区分大小写的匹配
‘c’区分大小写的匹配
‘n’允许‘.’(句点,配置任意字符)匹配换行符,如果省略此此参数,则句点与换行符不匹配
‘m’将源字符串视为多行。Oracle将源字符串中的^或$视为行首或行尾,如果省略此参数,Oracle将源字符串视为单行
‘x’忽略空格字符。默认情况下,空白字符与自身匹配。
如果指定多个矛盾值,Oracle将使用最后一个值,例如指定’ic’,则Oracle使用区分大小写匹配,如果指定的不是上述字符,则返回错误
如果省略match_parameter,则:
1.默认的区分大小写由NLS_SORT参数的值决定
2.句点‘.’与换行符不匹配
3.源字符串视为单行
以上中文内容为本人自行翻译,仅供参考
- 实验:
以下开始通过实验验证各参数功能的使用
- 简单使用:
实验 1:
SQL> select regexp_replace('0123456789','01234','0abc') from dual;
将 01234 替换为 0abc
完全匹配替换,并非对应替换
- 通过正则表达式匹配
实验 2:
SQL> select regexp_replace('01234abcde56789','[0-9]','*#') as new_str from dual;
将配置到的数字替换为’ *# ’
实验 3:
SQL> select regexp_replace('01234abcde56789','[a-z]') as new_str from dual;
将字符串中的字母去掉(小写字母)
实验 4:
SQL> select regexp_replace('+86 13811112222','(\+[0-9]{2})( )([0-9]{3})([0-9]{4})([0-9]{4})','()--') as new_str from dual;
格式化手机号,将+86 13811112222转换为(+86)138-1111-2222,’+’在正则里有定义,需转义
实验 5:
SQL> select regexp_replace('01234abcde','(.)',' ') from dual;
将字符用空格分隔
- 其他参数
实验 6:
SQL> select regexp_replace('#0a1b2C3D4e#','[0-9a-zA-Z]','*',4) as new_str from dual;
从第4个值开始(包含第4个值),将所有数字、小写字母、大写字母替换为 ’ * ’
实验7:
SQL> select regexp_replace('#01234abcDEFe#','[0-9a-zA-Z]','*',4,6) as new_str from dual;
从第4个值开始(包含第4个值),配置到第6个值时,将其替换为 ’ * ’
实验 8 :
SQL> select regexp_replace('abcdefg','[A-Z]','*',1,0,'i') from dual;
通过i参数,不区分大小写进行匹配
实验 9 :
SQL> select regexp_replace('a 2 b 3 c 4 d 5 e 6 f 7 g','([a-z])(.)','',1,0,'n') from dual;
通过n参数使 ’ . ’ 可以匹配换行符,实现合并
实验 10:
SQL> select regexp_replace('aa a a bb b b','a a','0') from dual;
SQL> select regexp_replace('aa a a bb b b','a a','0',1,0,'x') from dual;
对于第一条,匹配的是 ‘a a’
对于第二条,匹配的是 ‘aa’
由于对于参数 m(将源字符串视为多行)不了解,无法给予合适的说明实验,还望哪位大神出手相助一下
附:正则表达式(POSIX标准扩展正则ERE)
符号 | 释义 |
---|---|
\ | 代表它自己、引用下一个字符、引入一个操作符、什么也不做 |
* | 匹配零或多个 |
+ | 匹配一个或多个 |
? | 匹配零个或一个 |
| | 或运算,其左右操作数均可以为一个子表达式 |
^ | 默认情况下匹配字符串的开头。在多行模式下,它匹配源字符串中任意位置的行头 |
$ | 默认情况下匹配字符串的结尾。在多行模式下,它匹配源字符串中任意位置的行尾 |
. | 匹配字符集中支持的任意字符,NULL除外 |
[ ] | 用于指定匹配列表的括号表达式 |
( ) | 对表达式进行分组,将其视为单个子表达式 |
{m} | 恰好匹配m次 |
{m,} | 匹配至少m次 |
{m,n} | 匹配至少m次,但不超过n次 |
\n | 反向引用表达式(n为1~9)匹配在\n之前的圆括号内包含的第n个子表达式 |
[. .] | 指定排序规则,可以是多字符元素(例如,西班牙语中的[.ch.]) |
[: :] | 指定字符类(例如,[:alpha:]),它匹配字符类中的任何字符 |
[= =] | 指定等价类。(例如,[=a=]匹配索引具有基本字母a的字符) |
https://docs.oracle.com/cd/B19306_01/server.102/b14200/ap_posix001.htm#BABJDBHB
以上资料来源于Oracle官网,由本人自行理解翻译,如若有误请指正
[: :]字符类:
[:xxxx:] | 含义 | 范围 |
---|---|---|
[:space:] | 包括换行符、空格、tab在内的空白字符 | tab、空格 |
[:blank:] | 空格和tab | tab、空格 |
[:alpha:] | 字母 | a-z、A-Z |
[:alnum:] | 字母和数字 | a-z、A-Z、0-9 |
[:digit:] | 十进制数 | 0-9 |
[:xdigit:] | 十六进制数 | 0-9、a-f、A-F |
[:lower:] | 小写字母 | a-z |
[:upper:] | 大写字母 | A-Z |
[:cntrl:] | 控制字符 | ctrl、backspace等 |
[:punct:] | 标点符号 | ,.?’ |
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/130990.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...