WITH replacements (id, value, epos) AS (
SELECT ROWNUM, value, 1 FROM table_name
UNION ALL
SELECT id,
CASE
WHEN INSTR(value, ' ', epos) = 0 AND epos <= LENGTH(value) - 2
THEN SUBSTR(value, 1, epos)
|| LPAD('•', LENGTH(value) - epos - 1, '•')
|| SUBSTR(value, -1)
WHEN INSTR(value, ' ', epos) <= epos + 2
THEN value
ELSE SUBSTR(value, 1, epos)
|| LPAD('•', INSTR(value, ' ', epos) - epos - 2, '•')
|| SUBSTR(value, INSTR(value, ' ', epos) - 1)
END,
INSTR(value, ' ', epos) + 1
FROM replacements
)
SEARCH DEPTH FIRST BY id SET order_id
CYCLE id, epos SET is_cycle TO 1 DEFAULT 0
SELECT value
FROM replacements
WHERE is_cycle = 1;
其中,对于样本数据:
CREATE TABLE table_name (value) AS
SELECT 'ANNE MARRY' FROM DUAL UNION ALL
SELECT 'XI NG' FROM DUAL UNION ALL
SELECT 'A B C D E' FROM DUAL UNION ALL
SELECT 'MAY' FROM DUAL;
输出: | 价值| | - -----| | A··E M···Y| | 吴锡| | A B C D E| | M·Y| fiddle
3条答案
按热度按时间ddrv8njm1#
Oracle不支持使用单个正则表达式解决此问题所需的语法。
您可以使用简单的字符串函数和递归子查询,而无需正则表达式:
其中,对于样本数据:
输出:
| 价值|
| - -----|
| A··E M···Y|
| 吴锡|
| A B C D E|
| M·Y|
fiddle
z0qdvdin2#
我不知道在Oracle中使用的是哪种正则表达式引擎,但是如果你可以使用负向后看和向前看,那么你就可以匹配任何前面或后面没有单词边界的单词字符。在JavaScript中,你可以使用这个模式:
你可以在这里测试:https://regex101.com/r/N7yJDP/1
或者在这里运行:
qhhrdooz3#
我做了类似的事情,使用一个视图来显示屏蔽的数据和一个触发器
下面是我的步骤。