Многократное регулярное выражение, не использующее уровень - PullRequest
0 голосов
/ 25 апреля 2019

Я хочу разделить строки по одной и стать строкой.Я запросил его получить только арифметический оператор не для числа

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

input

141*47+2/5

результат:

*
--
+
--
/

мои ожидания:

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

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Вот один из способов:

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

NB. Я не учел числа в научном формате (например, 1.3e + 2, 2.6e-5), и я предположил, что отрицательные числа должны иметь минусподписать на отдельной строке.

0 голосов
/ 25 апреля 2019
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
UNION
SELECT
    REGEXP_SUBSTR('141*47+2/5','[0-9]+',1,LEVEL) AS FORMULA
FROM DUAL
CONNECT BY REGEXP_SUBSTR ('141*47+2/5','[0-9]+',1,LEVEL) IS NOT NULL

Я использую этот запрос, но он работает медленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...