假设我有一个字符串 (varchar2),并且我想在有两个连续 a 的地方添加一个空格。例如: 'graanh' -> 'gra anh'
.
好的,这很简单,无论是使用replace
还是regexp_replace
。但两人都在三个或更多连续的 a 上窒息。例如:
SQL> select replace('aaaaa', 'aa', 'a a') from dual;
REPLACE
-------
a aa aa
SQL> select regexp_replace('aaaaa', 'aa', 'a a') from dual;
REGEXP_
-------
a aa aa
这是因为对匹配模式的“下一个”匹配模式的搜索在“上一个”匹配模式的结尾之后开始。实际上,regexp_count('aaaaa', 'aa')
返回 2,而不是 4。
想要的结果是'aaaaa' -> 'a a a a a'
。
实际上,问题在于我不想替换模式'aa'
。我要替换的是空字符串两侧的空字符串 BETWEEN a's。所以描述会是这样的:找到所有出现的空字符串,两边都有a,然后用空格替换那个空字符串。
这可以用字符串或正则表达式函数来完成吗?请不要提供递归查询或(可怕的!)PL/SQL 过程的解决方案;我知道他们可以做到,但我感兴趣的是是否有一个“自然”的解决方案,一个正是针对这个问题而存在的工具,我错过了。
最坏的情况,replace(replace('aaaaa', 'aa', 'a a'), 'aa', 'a a')
会成功的。这也是最好的情况吗?
以免您认为这是一个奇怪的要求:我正在尝试使用不同的方法来拆分逗号分隔的字符串。一些方法有一个非常讨厌的习惯,即忽略此类字符串中的 NULL 标记(也就是说,从两个连续的逗号中,您不会得到 NULL,因为您应该这样做)。因此,在使用这些方法之前,必须解析输入字符串并在连续的逗号之间添加一个空格或字符串“NULL”或其他内容。当然,最好在每个逗号之后(以及字符串的开头)添加一个空格,并且在拆分为标记之后,从每个标记的开头删除一个空格;但这提出了我上面提出的问题,我认为这本身就有优点。
谢谢!
编辑(2020 年 4 月 13 日)自从我第一次发布这个问题以来,我学到了很多关于正则表达式的知识。现在我知道了这个术语。(我发现我给出的解释是正确的,我只是没有使用技术术语。)我们需要在这里,能够在需要的地方一次添加空格,是环视- 和 Oracle 正则表达式不支持他们。结束编辑