我试图嵌套一个正则表达式来修复我从一些数据中获得的输出。我无法控制数据,它来自不同的来源,我没有写访问权限。我复印的时候会把它弄干净。问题是一个名字,而且,是的,我知道问题确实是来源,我不能改变他们发送的内容。
我正在使用Oracle SQL Developer,在Oracle 11 g数据库上,以防万一。
Name:zhang cheng
我需要什么:Nancy Alice
我得到的是:Nancy Alice
在名字之间有两个空格,因为那里的空格保留,和括号变成空格。
名称之间只需要有一个空格,后面没有空格。
此操作可删除特殊字符
REGEXP_REPLACE(first_name, '[^0-9A-Za-z]', ' ')
然后得到Nancy Alice
,名字之间有两个空格,后面有一个空格。
这个工程删除删除特殊字符,然后修剪输出
trim(REGEXP_REPLACE(first_name, '[^0-9A-Za-z]', ' '))
然后我得到了Nancy Alice
,名字之间有两个空格,但是后面的空格消失了。
正如我所说的,问题是我需要在名称之间只有一个空格。
我试着用这个方法去掉特殊字符,然后去掉双精度和尾随空格:
REGEXP_REPLACE(REGEXP_REPLACE(first_name, '[^0-9A-Za-z]', ' '),'/^\s+|\s+$/g', '')
它没有工作,我仍然有双
我试过这个:
trim(REGEXP_REPLACE(REGEXP_REPLACE(first_name, '[^0-9A-Za-z]', ' '),'\\s+', ' '))
和
trim(REGEXP_REPLACE(REGEXP_REPLACE(first_name, '[^0-9A-Za-z]', ' '),'/\s\s+/g', ' '))
以及第二个“用一个替换两个”表达式的其他几次迭代,但都没有成功。
Trim似乎总是有效的,替换特殊字符也是如此,但是,一旦完成了,我还没有能够摆脱第一个表达式所创建的双空格。
我一直在网站上搜索,到目前为止我找到的例子都没有成功。
我错过了什么?
谢谢!
米歇尔
4条答案
按热度按时间wnvonmuf1#
在替换特殊字符并修剪周围的空格后,将多个空格替换为单个空格。
35g0bw712#
括号变成了空格
[...]
这将删除特殊字符:
REGEXP_REPLACE(first_name, '[^0-9A-Za-z]', ' ')
括号变成空格的唯一原因是因为在上面的操作中,您显式地将它们替换为空格。
如果你的计划只是删除特殊字符,你可以用空字符串代替空格;从而潜在地消除“修整多个空间”的整个问题?
我并不完全相信将
Nancy (Alice)
的“名字”编辑为Nancy Alice
是“正确”的解决方案,但我把这个判断留给你。xvw2m8pv3#
有时候正则表达式是多余的。如果您的数据总是按上面所示的格式进行格式化,则以下内容将完成这项工作,可能更清楚:
另一方面,您可以使用以下基于正则表达式的代码:
db<>fiddle here
vfwfrxfs4#
如果你只是想从一个字符串中删除
()
括号,那么你不需要正则表达式,可以使用对TRANSLATE
的单个调用:如果你想去掉所有非字母数字、非空格字符,那么:
注意:不要提供第三个参数,它不会插入额外的空格。
对于示例数据:
然后:
输出:
| 联系我们|替换1|替换2|
| --------------|--------------|--------------|
| 保姆(爱丽丝)|保姆爱丽丝|保姆爱丽丝|
fiddle