首页 > 解决方案 > 多个正则表达式不使用级别

问题描述

我想将字符串一一分开并成为行。我查询它只得到算术运算符而不是数字

SELECT
    REGEXP_SUBSTR('141*47+2/5','[^0-9]+| [0-9]+',1,LEVEL) AS FORMULA
FROM DUAL
CONNECT BY REGEXP_SUBSTR ('141*47+2/5','[^0-9]+| [0-9]+',1,LEVEL) IS NOT NULL

输入

141*47+2/5

结果 :

*
--
+
--
/

我的期望:

141
--
*
--
47
---
+
--
2
--
/
--
5

标签: sqlregexoracleoracle11g

解决方案


这是一种方法:

WITH sample_data AS (SELECT '141*47+2/5' str FROM dual UNION ALL
                     SELECT '100*(10 + 2)' str FROM dual UNION ALL
                     SELECT '-1*5+2/6' str FROM dual UNION ALL
                     SELECT '(10+2)*5' str FROM dual)
SELECT str,
       regexp_substr(str, '([[:digit:]]+|[\*/+-\(\)]{1})', 1, LEVEL) sub_str
FROM   sample_data
CONNECT BY regexp_substr(str, '([[:digit:]]+|[\*/+-\(\)]{1})', 1, LEVEL) IS NOT NULL
           AND PRIOR str = str
           AND PRIOR sys_guid() IS NOT NULL;

STR          SUB_STR
------------ ------------
(10+2)*5     (
(10+2)*5     10
(10+2)*5     +
(10+2)*5     2
(10+2)*5     )
(10+2)*5     *
(10+2)*5     5
-1*5+2/6     -
-1*5+2/6     1
-1*5+2/6     *
-1*5+2/6     5
-1*5+2/6     +
-1*5+2/6     2
-1*5+2/6     /
-1*5+2/6     6
100*(10 + 2) 100
100*(10 + 2) *
100*(10 + 2) (
100*(10 + 2) 10
100*(10 + 2) +
100*(10 + 2) 2
100*(10 + 2) )
141*47+2/5   141
141*47+2/5   *
141*47+2/5   47
141*47+2/5   +
141*47+2/5   2
141*47+2/5   /
141*47+2/5   5

注意我没有考虑科学格式的数字(例如 1.3e+2、2.6e-5),并且我假设负数应该在单独的行上有减号。


推荐阅读