1

假设我有一个字符串 (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 正则表达式不支持他们。结束编辑

4

1 回答 1

2

如果您真的发现 PL/SQL的恐怖和递归查询不自然,那么您可能必须使用replace(replace('aaaaa', 'aa', 'a a'), 'aa', 'a a'),正如您已经提出的那样,尽管是“最坏的情况”。为什么你认为这是最坏的情况我仍然不清楚。

于 2016-07-23T06:02:33.007 回答