Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL-编辑自由文本叙述中长度不同的数字的最后四位以外的所有多次出现_Sql_Regex_String_Oracle_Redaction - Fatal编程技术网

Oracle SQL-编辑自由文本叙述中长度不同的数字的最后四位以外的所有多次出现

Oracle SQL-编辑自由文本叙述中长度不同的数字的最后四位以外的所有多次出现,sql,regex,string,oracle,redaction,Sql,Regex,String,Oracle,Redaction,是否有直接的方法(可能使用REGEXP_REPLACE或类似方法)对自由文本中出现的除最后四位数字或5或以上长度变化以外的所有数字进行修订文本中可能多次出现单独的数字 例如 使用REGEX_REPLACE显然可以直接将所有数字替换为*,但它保留了最后四位数字,并替换为正确的*数字,这让我很恼火 任何帮助都将不胜感激 就上下文而言,由于通常的业务限制,这必须在检索数据的查询中完成,而不是使用实际的Oracle DBMS编校功能 非常感谢。您可以尝试以下正则表达式: regexp_replace(t

是否有直接的方法(可能使用REGEXP_REPLACE或类似方法)对自由文本中出现的除最后四位数字或5或以上长度变化以外的所有数字进行修订文本中可能多次出现单独的数字

例如

使用REGEX_REPLACE显然可以直接将所有数字替换为*,但它保留了最后四位数字,并替换为正确的*数字,这让我很恼火

任何帮助都将不胜感激

就上下文而言,由于通常的业务限制,这必须在检索数据的查询中完成,而不是使用实际的Oracle DBMS编校功能


非常感谢。

您可以尝试以下正则表达式:

regexp_replace(txt, '(\d{4})(\d+(\D|$))', '****\2')
这将捕获由4个数字组成的序列,后跟至少一个数字,然后是一个非数字字符或字符串的结尾,并将它们替换为4颗星

:


这是因为regexp引擎的灰色性,它会发出尽可能多的'\d+'的声音。

如果你真的需要保持数字的长度,那么我认为没有办法一步到位。您必须将字符串拆分为数字而不是数字,然后分别替换数字:

如果字符串为所需格式,请选择listaggCASE WHEN REGEXP_likeText,'\d{5,}' 然后LPAD'*',LENGTHtxt-4'*'| | substrText,LENGTHtxt-3-将除最后4位以外的所有数字替换为* ELSE txt结束 集团内部订单(按lvl) 从SELECT LEVEL lvl,REGEXP|u substrText,“\d+\d+”,1,LEVEL txt-将字符串拆分为数字和非数字部分 从中选择“这是一个测试文本,数字为12345、9876543210,单独数字为123456787654321,全部隐藏在文本中”,作为dual中的txt 通过REGEXP_substrText连接,“\d+\d+”,1,级别不为NULL 结果:

当您的示例替换第一个数字的第一个数字时,您可能还希望替换至少4个数字:

如果字符串为所需格式,请选择listaggCASE WHEN REGEXP_likeText,'\d{5,}' 然后LPAD'*',GREATESTLENGTHtxt-4,4'*',| | substrText,GREATESTLENGTHtxt-3,5-将除最后4位以外的所有数字替换为* ELSE txt结束 集团内部订单(按lvl) 从SELECT LEVEL lvl,REGEXP|u substrText,“\d+\d+”,1,LEVEL txt-将字符串拆分为数字和非数字部分 从中选择“这是一个测试文本,数字为12345、9876543210,单独数字为123456787654321,全部隐藏在文本中”,作为dual中的txt 通过REGEXP_substrText连接,“\d+\d+”,1,级别不为NULL 在第二行中添加最大值以替换至少4位数字

结果:


为什么是\D部分?如果字符串以数字结尾,则可能会出现问题,对吗?\D是非数字字符。它定义了数字的结尾。@Aleksej:好的。我修改了regexp以正确管理字符串末尾的数字。这很有效,但我相信您甚至可以使用'\d{4}\d+';我错过了什么吗?@Aleksej:我想你是对的。我用这个简单的解决方案编辑了我的答案。谢谢这个解决方案会产生准确的预期结果,所以+1.Thx@GMB,我个人也会使用您的解决方案,并始终打印固定长度的星号。数字的长度是我不想在隐藏实际数据的情况下提供的附加信息。。。
regexp_replace(txt, '(\d{4})(\d+(\D|$))', '****\2')
with t as (select 'select This is a test text with numbers 12345, 9876543210 and separately number 1234567887654321 all buried within the text' txt from dual)
select regexp_replace(txt, '(\d{4})(\d+\D)', '****\2') new_text from t
| NEW_TEXT | | :-------------------------------------------------------------------------------------------------------------------------- | | select This is a test text with numbers ****5, ****543210 and separately number ****567887654321 all buried within the text |
regexp_replace(txt, '(\d{4})(\d+)', '****\2')
This is a test text with numbers *2345, ******3210 and separately number ************4321 all buried within the text
This is a test text with numbers ****5, ******3210 and separately number ************4321 all buried within the text