我有一个要求。有一个名称列/字段,它包含像' A这样的名称。亚伦' ,我想删除点之前的空格,并在点出现后添加空格。如果在点之后已经存在空间,我也想离开。我尝试使用替换首先删除空格,之后我不知道如何在点出现后添加空格。任何人都可以帮我吗?
答案 0 :(得分:1)
1使用replace删除点之前的空格。
replace(column,' .','.')
2使用“替换”删除点后的空格。
replace(column,'. ','.')
3点后添加空格
replace(column,'.','. ')
这加起来:
replace(replace(replace(column,' .','.'),'. ','.'),'.','. ')
答案 1 :(得分:0)
那不是更干净吗?我不确定所需的输入数据是什么。它是否始终具有空格点空间子字符串或其中任何一个是可选的?在这种情况下,您总是可以使用regexp_replace
select replace('A . aaron',' . ','. ') from dual;
答案 2 :(得分:0)
您也可以这样使用:
select regexp_replace(replace('A . aaron.xsd',' .','.'),'\.(\s)?','. ') from dual;
或者这个(这会删除点之前和之后的额外空格):
select regexp_replace('A . aaron -- A. aaron -- A.aaron','(\s)*\.(\s)*','. ')
from dual
答案 3 :(得分:0)
可以在一次regexp_replace
电话中完成。逻辑是围绕字符串的所有组件进行分组,然后按所需顺序将组放在一起。尝试所有可以测试数据的场景。
SQL> with tbl(name) as (
2 select 'A . aaron' from dual
3 union
4 select 'A. aaron' from dual
5 union
6 select 'A .aaron' from dual
7 union
8 select 'A.aaron' from dual
9 )
10 select name, regexp_replace(name, '^(\w)( )?(\.)( )?(.*)', '\1\3 \5') fixed_name
11 from tbl;
NAME FIXED_NAME
--------- ---------------
A . aaron A. aaron
A .aaron A. aaron
A. aaron A. aaron
A.aaron A. aaron
SQL>
匹配模式解释:
^ Match the beginning of the string
( Start first remembered group
\w Match a word. matches up to a space or punctuation character
) End first remembered group
( )? Followed by the second group which is an optional space
(\.) Followed by a literal period (third group)
( )? Followed by the 4th group which is an optional space
(.*) Followed by the 5th remembered group, the rest of the string.
替换模式说明:
\1 Replace with the first remembered group
\3 Followed by the 3rd remembered group which should be the literal period
<space> Followed by a space
\5 Followed by the rest of the string
编辑:不同的分组/替换技术,它捕获并忽略初始单词之后和字符串其余部分之前的一个或多个空格或句点字符。
select name, regexp_replace(name, '^(\w)([ \.]+)(.*)', '\1. \3') fixed_name
from tbl;
有趣的是要注意匹配正则表达式中的句点需要被转义(否则它是一个特殊的正则表达式符号,意思是任何字符),在替换字符串中,它不是因为它是一个字面句点。