正则表达式函数中的特殊字符问题

Posted

技术标签:

【中文标题】正则表达式函数中的特殊字符问题【英文标题】:problem with special characters in regexp funcion 【发布时间】:2021-03-07 09:57:47 【问题描述】:

我在 Oracle 中解析字符串,但提供者的名称有一个特殊字符,如“&”和“-”。我无法处理它。谁能帮帮我?

SELECT arraylist.* , inserted.*
FROM (
    select trim(regexp_substr(str,'[^;]+', 1, level)) as str1
    from ( 
       SELECT ('Cogent Communications Poland Sp. z.o.o. - 100000Mbps;E-point - 100000Mbps; T-Mobile - 100000Mbps; Net  Friends - 100000Mbps' ) as Str 
       FROM dual
       
    
    )
    connect by regexp_substr(str, '[^;]+', 1, level) is not null
) inserted
CROSS APPLY(
    select trim(regexp_substr(str1,'[^-]+', 1, 1)) as key,
           trim(regexp_substr(str1,'[^-]+', 1, 2)) as value
    from dual
) arraylist

结果是:

【问题讨论】:

【参考方案1】:

这是处理多字符分隔字符串的一种方法。首先 CTE 只是设置数据。 tbl_case 是在分号上拆分的结果。最后拆分 ' - ' 的分隔符以获得您的名称-值对。

注意几件事。这些值是不现实的,但用于区分不同的行。 '(.*?)(;|$)' 的正则表达式形式正确处理 NULL 元素,如果它们发生的话。有关更多信息,请参阅this post。

-- Set up data
WITH tbl(ID, DATA) AS (
  SELECT 1, 'Cogent Communications Poland Sp. z.o.o. - 100001Mbps;E-point - 100002Mbps; T-Mobile - 100003Mbps; Net  Friends - 100004Mbps' FROM dual UNION ALL
  SELECT 2, 'Cogent Communications Poland Sp. z.o.o. - 200001Mbps;E-point - 200002Mbps; T-Mobile - 200003Mbps; Net  Friends - 200004Mbps' FROM dual
),
-- Split on semi-colons
tbl_case(ID, CASE) AS (
SELECT ID,
       TRIM(REGEXP_SUBSTR(DATA, '(.*?)(;|$)', 1, LEVEL, NULL, 1)) CASE
FROM tbl
CONNECT BY REGEXP_SUBSTR(DATA, '(.*?)(;|$)', 1, LEVEL) IS NOT NULL 
  AND PRIOR ID = ID
  AND PRIOR SYS_GUID() IS NOT NULL        
)  
--select * from tbl_case;         
-- Parse cases into name/value pairs
SELECT ID,
       REGEXP_REPLACE(CASE, '^(.*) - .*', '\1') name,
       REGEXP_REPLACE(case, '.* - (.*)$', '\1') value
from tbl_case



        ID NAME                                     VALUE               
---------- ---------------------------------------- --------------------
         1 Cogent Communications Poland Sp. z.o.o.  100001Mbps          
         1 E-point                                  100002Mbps          
         1 T-Mobile                                 100003Mbps          
         1 Net  Friends                             100004Mbps          
         2 Cogent Communications Poland Sp. z.o.o.  200001Mbps          
         2 E-point                                  200002Mbps          
         2 T-Mobile                                 200003Mbps          
         2 Net  Friends                             200004Mbps          

8 rows selected.

【讨论】:

以上是关于正则表达式函数中的特殊字符问题的主要内容,如果未能解决你的问题,请参考以下文章

在正则表达式中转义特殊字符

Python函数篇-正则表达式

正则校验字母数字特殊字符的函数

正则表达式判断字符串中包含数字、大写字符、小写字母、特殊符号中的几种怎么判断?

正则表达式

正则表达式