Получить символы до сопоставления с шаблоном - PullRequest
0 голосов
/ 11 января 2019
135 ;1111776698 ;AB555678765

У меня есть вышеуказанная строка, и я ищу, чтобы получить все цифры до первого появления ;.

Но количество символов до первого вхождения ; варьируется, т. Е. Это может быть 4-значное число или 3-значное число.

Я играл с regex_instr и instr, но не смог понять это.

Запрос должен вернуть все цифры до первого вхождения ;

Ответы [ 5 ]

0 голосов
/ 12 января 2019

Чтобы получить желаемый результат, вы должны использовать REGEX_SUBSTR, так как он извлечет нужные данные из строки, которую вы даете. Вот пример запроса.

Решение для вашего примера:
SELECT REGEXP_SUBSTR('135 ;1111776698 ;AB555678765','[^;]+',1,1) FROM DUAL;

Итак, что он делает, Regex разбивает строку на основе ; разделителя. Вы нуждались в первом появлении, поэтому я привел аргументы как 1,1.
Поэтому, если вам нужна вторая строка 1111776698 в качестве выходных данных, вы можете указать аргумент 1,2.

Синтаксис для Regexp_substr следующий:
REGEXP_SUBSTR( string, pattern [, start_position [, nth_appearance [, match_parameter [, sub_expression ] ] ] ] )

Вот ссылка на дополнительные примеры: https://www.techonthenet.com/oracle/functions/regexp_substr.php

Дайте мне знать, если это работает для вас. Удачи.

0 голосов
/ 11 января 2019

Убедитесь, что вы попробуйте все возможные значения в этой первой позиции, даже те, которые вы не ожидаете, и убедитесь, что они обрабатываются так, как вы хотите. Всегда ожидайте неожиданного! Это регулярное выражение соответствует первой подгруппе, состоящей из нуля или более необязательных цифр (допускает возврат значения NULL), после которого следует дополнительный пробел, затем точка с запятой или конец строки. Возможно, вам придется ужесточить (или ослабить) правила сопоставления для вашей ситуации, просто обязательно проверяйте даже на неправильные значения, особенно если ввод поступает из введенных пользователем данных.

with tbl(id, str) as (
  select 1, '135 ;1111776698 ;AB555678765' from dual union all
  select 2, ' 135 ;1111776698 ;AB555678765' from dual union all
  select 3, '135;1111776698 ;AB555678765' from dual union all
  select 4, ';1111776698 ;AB555678765' from dual union all
  select 5, ';135 ;1111776698 ;AB555678765' from dual union all
  select 6, ';;1111776698 ;AB555678765' from dual union all
  select 7, 'xx135 ;1111776698 ;AB555678765' from dual union all
  select 8, '135;1111776698 ;AB555678765' from dual  union all
  select 9, '135xx;1111776698 ;AB555678765' from dual                     
)
select id, regexp_substr(str, '(\d*?)( ?;|$)', 1, 1, NULL, 1) element_1
from tbl
order by id;

       ID ELEMENT_1                     
---------- ------------------------------
         1 135                           
         2 135                           
         3 135                           
         4                               
         5                               
         6                               
         7 135                           
         8 135                           
         9                               

9 rows selected.
0 голосов
/ 11 января 2019

Использование INSTR,SUBTSR и TRIM должно работать (на основе вашего комментария, что есть " только пробелы и цифры ")

select TRIM(SUBSTR(s,1, INSTR(s,';')-1)) FROM t;

Демо

0 голосов
/ 11 января 2019

Следующее использование regexp_substr() должно работать:

SELECT s, REGEXP_SUBSTR(s, '^[^;]*')
0 голосов
/ 11 января 2019

Этот ответ предполагает, что вы используете базу данных Oracle. Я не знаю, как это сделать, используя только REGEX_INSTR, но мы можем сделать с REGEXP_REPLACE, используя группы захвата:

SELECT REGEXP_REPLACE('135 ;1111776698 ;AB555678765', '^\s*(\d{3,4})\s*;.*', '\1')
FROM dual;

Демо

Здесь используется шаблон регулярного выражения:

^\s*(\d{3,4})\s*;.*

Это позволяет, с начала строки, любое количество начальных пробелов, затем 3 или 4-значное число, затем снова любое количество пробелов, затем точка с запятой. .* в конце шаблона просто потребляет все, что остается в вашей строке. Примечание (\d{3,4}), которое фиксирует 3-4-значный номер, который затем доступен в замене как \1.

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