oracle 嵌套正则表达式

20jt8wwn  于 2023-05-16  发布在  Oracle
关注(0)|答案(4)|浏览(222)

我试图嵌套一个正则表达式来修复我从一些数据中获得的输出。我无法控制数据,它来自不同的来源,我没有写访问权限。我复印的时候会把它弄干净。问题是一个名字,而且,是的,我知道问题确实是来源,我不能改变他们发送的内容。
我正在使用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似乎总是有效的,替换特殊字符也是如此,但是,一旦完成了,我还没有能够摆脱第一个表达式所创建的双空格。
我一直在网站上搜索,到目前为止我找到的例子都没有成功。
我错过了什么?
谢谢!
米歇尔

wnvonmuf

wnvonmuf1#

在替换特殊字符并修剪周围的空格后,将多个空格替换为单个空格。

REGEXP_REPLACE(TRIM(REGEXP_REPLACE('[^0-9A-Za-z]', ' ')), '\s{2,}', ' ')
35g0bw71

35g0bw712#

括号变成了空格
[...]
这将删除特殊字符:
REGEXP_REPLACE(first_name, '[^0-9A-Za-z]', ' ')
括号变成空格的唯一原因是因为在上面的操作中,您显式地将它们替换为空格。
如果你的计划只是删除特殊字符,你可以用空字符串代替空格;从而潜在地消除“修整多个空间”的整个问题?

REGEXP_REPLACE(first_name, '[^0-9A-Za-z ]', '')

我并不完全相信将Nancy (Alice)的“名字”编辑为Nancy Alice是“正确”的解决方案,但我把这个判断留给你。

xvw2m8pv

xvw2m8pv3#

有时候正则表达式是多余的。如果您的数据总是按上面所示的格式进行格式化,则以下内容将完成这项工作,可能更清楚:

REPLACE(REPLACE(first_name, '(', ''), ')', '')

另一方面,您可以使用以下基于正则表达式的代码:

FIRST_NAME := REGEXP_SUBSTR('Nancy (Alice)', '[^()]+', 1, 1) ||
              REGEXP_SUBSTR('Nancy (Alice)', '[^()]+', 1, 2);

db<>fiddle here

vfwfrxfs

vfwfrxfs4#

如果你只是想从一个字符串中删除()括号,那么你不需要正则表达式,可以使用对TRANSLATE的单个调用:

TRANSLATE(first_name, 'A()', 'A')

如果你想去掉所有非字母数字、非空格字符,那么:

REGEXP_REPLACE(first_name, '[^[:alnum:] ]')

注意:不要提供第三个参数,它不会插入额外的空格。
对于示例数据:

CREATE TABLE table_name (first_name) AS
SELECT 'Nanny (Alice)' FROM DUAL;

然后:

SELECT first_name,
       TRANSLATE(first_name, 'A()', 'A') AS replacement1,
       REGEXP_REPLACE(first_name, '[^[:alnum:] ]') AS replacement2
FROM   table_name;

输出:
| 联系我们|替换1|替换2|
| --------------|--------------|--------------|
| 保姆(爱丽丝)|保姆爱丽丝|保姆爱丽丝|
fiddle

相关问题