【问题标题】:Using Oracle Regular Expression - Masking based on pattern使用 Oracle 正则表达式 - 基于模式的屏蔽
【发布时间】:2012-12-13 11:03:21
【问题描述】:

清理,

使用 Oracle 11g PL/SQL,对于以下查询,我可以获取捕获组的位置吗(类似于 Matcher.start() 在 java 中提供的内容)。

    `select regexp_replace('1234bankzone1234', '^..(.*)bank(zone).(.*)..$', '\2') from dual`

结果应类似于:“zone”,9(文本“zone”的开头)。

我试图解决的更大问题是使用“^.....(.*)..$”之类的模式来屏蔽帐号等数据(此模式可能因安装而异)。

【问题讨论】:

  • 对你到底想要什么还是有点困惑。你能给出一个期望结果的简单输入/输出示例吗?
  • 我和@tbone 在一起;我不知道您要掩盖什么以及您希望它看起来像什么。
  • @AjithSasidharan,你必须wait 2 days 才能开始赏金。

标签: regex oracle masking


【解决方案1】:

以下内容对您有用吗?

select regexp_replace('1234bankzone1234', '^..(.*)bank(zone).(.*)..$', '\2') expr ,instr('1234bankzone1234',regexp_replace('1234bankzone1234', '^..(.*)bank(zone).(.*)..$', '\2')) pos from dual

或更易读的子查询,如

select a.*, instr(a.value,a.expr) from ( select '1234bankzone1234' value, regexp_replace('1234bankzone1234', '^..(.*)bank(zone).(.*)..$', '\2') expr from dual ) a

我找不到任何类似 Matcher API 的直接等效功能,并且您无法访问 SQL 中的职位组缓冲区。

【讨论】:

  • 这在某些情况下可能会导致问题。
  • 这在某些情况下可能会导致问题。如果有多个捕获组并且一个匹配是另一个的子集(假设 2 个捕获组具有“zone”和“azone”匹配),我会错过其中一个。使用不同类型的数据(设备 ID、帐户/PAN/客户 # 等)和多次安装,风险会更高。
  • 确实如此。您知道您要尝试屏蔽的文本的大小以及其中包含的组/模式的数量吗?我问的原因是以某种方式分组更多的是字符串拆分并将它们放在一起。只要您有
  • 不幸的是,要屏蔽的文本的大小和屏蔽模式可能会有所不同。多种数据(帐号、IP 地址、日期...)的多次安装需要屏蔽。对于帐号本身,我已经看到了至少 3 种不同的模式。
  • 这就是我现在正在做的事情:1)反转该掩码模式。 2) 获取原始模式和反向模式中捕获组的索引和计数。 3) 从源字符串中获取原始和反向模式捕获组的匹配文本 4) 根据步骤 2 中获得的索引合并步骤 3 中捕获的文本。用原始字符串屏蔽匹配项。我将在下面提供更多详细信息。
【解决方案2】:

1:使用 this 反转模式

regexp_replace( regexp_replace( regexp_replace( regexp_replace( regexp_replace( regexp_replace( regexp_replace( regexp_replace( regexp_replace( pattern, '(\()', '\1#') , '(\))', '#\1') , '\(#', ')#') , '\^\)#', '^') , '#\)\$', '$') , '#\)', '(#') , '#', '') , '\^([^\(]+\))', '^(\1') , '\(([^\)]+)\$', '(\1)$');

所以,"^(.)..(.).$";变成 "^.(..).(.)$";

2:使用它来批量收集两种模式中捕获组的索引和计数

SELECT REGEXP_instr(pattern, '\(.*?\)+', 1, LEVEL) bulk collect into posCapture FROM v CONNECT BY LEVEL <= REGEXP_COUNT(pattern, '\(.*?\)');

3:将两种模式与要屏蔽的文本匹配。按步骤 2 中找到的顺序合并它们。

select regexp_replace(v_src, pattern, '\' || captureIndex) into tempStr from dual;

【讨论】:

    猜你喜欢
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    相关资源
    最近更新 更多