Невозможно получить второе вхождение шаблона, используя регулярное выражение в Oracle - PullRequest
0 голосов
/ 09 мая 2018
SELECT
  REGEXP_SUBSTR('500 ,Oracle 1234,123Parkway123aa 123, 768Redwood Shores, CA,',
                '\d+,\d+[^,]+,',1,2) "REGEXPR_SUBSTR"
  FROM DUAL;

Ожидается получение вывода для второго вхождения как 123, 768Redwood Shores, но как только я смогу правильно получить первый шаблон вхождения, а не второй, я не совсем понимаю, почему? Может кто-нибудь, пожалуйста, объясните мне, спасибо.

1 Ответ

0 голосов
/ 09 мая 2018

[TL; DR] Регулярные выражения не находят совпадающих совпадений.


Первый матч:

SELECT REGEXP_SUBSTR(
         '500 ,Oracle 1234,123Parkway123aa 123, 768Redwood Shores, CA,',
         '\d+,\d+[^,]+,',
         1,
         1
       ) "REGEXPR_SUBSTR"
FROM   DUAL;

Является:

1234,123Parkway123aa 123,

Будет выполнен поиск второго совпадения после первого совпадения (не совпадает с первым совпадением); поэтому будет искать второе совпадение в подстроке:

' 768Redwood Shores, CA,'

и ничего не находит.

Даже если регулярные выражения поддерживают перекрывающиеся совпадения (они этого не делают), они ничего не найдут, поскольку после запятой есть пробел, который не соответствует вашему шаблону.

Это позволит перекрывать совпадения (но гораздо сложнее и не является единственной функцией):

SQL Fiddle

Запрос 1 :

WITH data ( value ) AS (
  SELECT '500 ,Oracle 1234,123Parkway123aa 123, 768Redwood Shores, CA,'
  FROM   DUAL
),
pos ( value, match, pos, lvl ) AS (
  SELECT value,
         REGEXP_SUBSTR( value, '\d+,\s*\d+[^,]+?(\d*),', 1, 1 ),
         REGEXP_INSTR( value, '\d+,\s*\d+[^,]+?(\d*),', 1, 1, 0, NULL, 1 ),
         1
  FROM   data
UNION ALL
  SELECT value,
         REGEXP_SUBSTR( value, '\d+,\s*\d+[^,]+?(\d*),', pos, 1 ),
         REGEXP_INSTR( value, '\d+,\s*\d+[^,]+?(\d*),', pos, 1, 0, NULL, 1 ),
         lvl + 1
  FROM   pos
  WHERE  pos > 0
)
SELECT match
FROM   pos
WHERE  pos > 0
AND    lvl = 2

Результаты

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