Регулярные выражения соответствуют номерам, по крайней мере, из 6 цифр, которые имеют только до 3 цифр, отличных от 0 - PullRequest
0 голосов
/ 09 октября 2018

РЕДАКТИРОВАТЬ

Мне нужно идентифицировать все числа по крайней мере 6 цифр и максимум 25 цифр, имеющие только 1-3 цифры, которые отличаются от 0.

Примеры: 000123, 0103040000, 10320000, 70000000, 12000009000

Я пытался что-то вроде этого:

regexp_like(number, '[1-9]\d{1,3}') AND regexp_like(number,'(0){5,24}')

(можно использовать более одного регулярного выражения)

Ноэто также соответствует числам, таким как:

0046700000031,00394000007 - Это не должно совпадать, потому что они имеют 4 цифры, отличные от 0, должны совпадать числа с минимум 1 цифрой, отличной от 0, и максимум 3 цифрами, отличной от 0

Я использую Oracle 12C.

РЕШЕНИЕ

Вот альтернатива, которую я нашел, которая, кажется, работает, но я полагаю, только в Oracle.

SELECT NUMBER
FROM TABLE t
WHERE LENGTH(NUMBER) > 5 HAVING(regexp_count(NUMBER, '0') > 2
      AND regexp_count(NUMBER, '[1-9]') BETWEEN 1 AND 3)
GROUP BY NUMBER

Спасибо

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Попробуйте этот шаблон (?=^([123456789]*0){1,3}[123456789]*$)\d{6,25}.

Объяснение: он использует предпросмотр, чтобы изменить то, что следует, содержит не более трех нулей с шаблоном: (?=^([123456789]*0){1,3}[123456789]*$).

Демонстрация

0 голосов
/ 09 октября 2018

Вы не можете использовать одно регулярное выражение, чтобы делать то, что вам нужно в Oracle 12C, потому что механизм регулярных выражений основан на POSIX и не позволяет искать обходные пути, смотреть назад или смотреть назад.Вам нужно использовать один шаблон для проверки формата строки и обычную функцию LENGTH.

Вот полная демонстрация:

WITH testdata(txt) AS (
      SELECT '000123'        from dual
      UNION
      SELECT '0103040000'    from dual
      UNION
      SELECT '10320000'      from dual
      UNION
      SELECT '70000000'      from dual
      UNION
      SELECT '12000009000'   from dual
      UNION
      SELECT '0046700000031' from dual
      UNION
      SELECT '00394000007'   from dual
   )
   SELECT * FROM testdata WHERE REGEXP_LIKE(txt, '^(0*[1-9]){1,3}0*$') AND LENGTH(txt) > 5 AND LENGTH(txt) < 26

См. Регулярное выражение демо .Подробности:

  • ^ - начало строки
  • (0*[1-9]){1,3} - один, два или три повторения
    • 0* - ноль или более нулей
    • [1-9] - ненулевая цифра
  • 0* - 0+ нулей
  • $ - конец строки.

См. Демонстрационную версию Oracle онлайн .

0 голосов
/ 09 октября 2018

Один из вариантов - использовать положительный прогноз для проверки как минимум одной, но не более трех ненулевых цифр:

^(?=.*[1-9])(?!.*[1-9].*[1-9].*[1-9].*[1-9])[0-9]{6,25}$

В такой базе данных, как Postgres, мы можем попробовать следующееquery:

SELECT *
FROM yourTable
WHERE number ~ '^(?=.*[1-9])(?!.*[1-9].*[1-9].*[1-9].*[1-9])[0-9]{6,25}$';

Используя базу данных, такую ​​как SQL Server, которая напрямую не поддерживает регулярное выражение, но имеет некоторую возможность регулярного выражения LIKE, мы можем попробовать:

WHERE LEN(number) BETWEEN 6 AND 25 AND             -- 6 to 25 digits
      number LIKE '%[1-9]%' AND                    -- at least 1 non zero digit
      number NOT LIKE '%[1-9]%[1-9]%[1-9]%[1-9]%'  -- at most 3 non zero digits
      number NOT LIKE '%[^0-9]%';                  -- all numbers
...