如何缩短正则表达式

Posted

技术标签:

【中文标题】如何缩短正则表达式【英文标题】:How to Shorted Regular Expression 【发布时间】:2020-01-09 03:56:15 【问题描述】:

我有一个 RegExp 如下,当我在 Oracle SQL 中使用它时,出现 ORA-12723 错误,我怎样才能让它以最短的格式显示?

WITH test_data ( str ) AS (
    SELECT 'This is extension 1234, here is mobile phone: 090-1234-5678 maybe 8+24-98765432. Then +1-(234)-090-345 also 86 21-4566-4556' AS str FROM DUAL
)
SELECT TRIM(
    TRAILING ',' FROM
    REGEXP_REPLACE(
       str,
       '.*?(\+?\d1,11[-,\+]\d1,11[-,\+]\d1,11[-,\+]\d1,11[-,\+]\d1,11[-,\+]\d3,11|\+?\d1,11[-,\+]\d1,11[-,\+]\d1,11[-,\+]\d1,11[-,\+]\d3,11|\+?\d1,11[-,\+]\d1,11[-,\+]\d1,11[-,\+]\d3,11|\+?\d1,11[-,\+]\d1,11[-,\+]\d3,11|\+?\d1,11[-,\+]\d3,11|\d3,11|$)',
       '\1,'
    )
) AS replaced_str
FROM test_data

我想知道的结果如下:

1234,090-1234-5678,8+24-98765432,+1-(234)-090-345,86 21-4566-4556

【问题讨论】:

你想用你的正则表达式实现什么? 一些匹配看起来如何? 我想匹配所有不同格式的电话号码,它们可以是 3-11 位数字,数字之间有其他字符。 select regexp_substr 与您的正则表达式在我的 oracle 中为我工作。你有什么版本的 oracle,你用什么命令来应用正则表达式? 我更新了我的问题,你能帮帮我吗? 【参考方案1】:

考虑这种方法。这使用CONNECT BY 遍历字符串并将其解析为由空格或行尾分隔的元素。然后对于每个元素,删除非数字字符('\D')。最后使用LISTAGG() 将元素放回一个逗号分隔的字符串中。

WITH test_data(str) AS (
    SELECT 'Txa233g141b Ta233141 Ta233142 Ta233147zz Ta233xx148zz' AS str FROM DUAL
)
SELECT listagg(regexp_replace(regexp_substr(str, '(.*?)( |$)', 1, level, null, 1), '\D'), ',') 
         within group (order by str) replaced_str
FROM test_data
connect by level <= regexp_count(str, ' ') + 1;


REPLACED_STR                                                                    
--------------------------------------------------------------------------------
233141,233141,233142,233147,233148    

1 row selected.

【讨论】:

我需要把这个正则表达式做空.*?(\+?\d1,11[-,\+]\d1,11[-,\+]\d1,11[-,\+]\d1,11[-,\+]\d1,11[-,\+]\d3,11|\+?\d1,11[-,\+]\d1,11[-,\+]\d1,11[-,\+]\d1,11[-,\+]\d3,11|\+?\d1,11[-,\+]\d1,11[-,\+]\d1,11[-,\+]\d3,11|\+?\d1,11[-,\+]\d1,11[-,\+]\d3,11|\+?\d1,11[-,\+]\d3,11|\d3,11|$)...,上面的数据只是样本,不是真实数据... 显示真实数据,以及您期望的处理后的样子。更新您的原始帖子。 或者,您是否尝试将真实数据插入我的解决方案?成功了吗? 更新了我的问题。 好的,将示例中的字符串替换为新的测试数据,并将示例中的分隔符更改为逗号而不是两个地方的空格。

以上是关于如何缩短正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

亚马逊短网址正则表达式...为啥我不能让它工作

python 正则表达式 re,compile速度慢 ,怎样可以使的re.compile的速度更快

正则表达式如何匹配多行的所有任意字符

如何修改一个正则表达式的匹配方式

正则表达式如何匹配提取括号中的内容

正则表达式如何匹配空值?