Regex для анализа не менее 20 символов текста без пробелов из строки - PullRequest
0 голосов
/ 14 февраля 2019

Мне нужно проанализировать код из введенного вручную строкового поля в запросе SQL для БД Oracle, который может выглядеть примерно так:

"я бы хотел!! Хотел бы / сделал * bb a8 001 / XYZ / 0002/ 65432178 спасибо большое друзья "

Количество слов в каждой строке полностью отличается, единственное, что одинаковые - это пробелы между словами.Где-то посередине (но может быть также в самом начале или в самом конце) строки находится CODE с переменной длиной (всегда не менее 20 символов), который мне нужно проанализировать - код всегда без пробелов и отделен от остальной части случайноготекст по пробелам.Мне нужно разобрать только код вырезания всех слов.Таким образом, единственный способ идентифицировать код, по моему мнению, состоит в том, что в нем должна быть как минимум 20 последовательностей символов без пробела.Можете ли вы порекомендовать регулярные выражения для такого рода вещей?Большое спасибо

, поэтому я ожидаю получить такую ​​строку "001 / XYZ / 0002/65432178"

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Если у вас никогда не будет слов длиной более 20 символов, вы можете наивно использовать:

SELECT REGEXP_SUBSTR( value, '\S{20,}' ) AS code,
       value
FROM   data d;

Однако, если у вас есть слова длиной более 20 символов, например:

CREATE TABLE data ( value ) AS
SELECT 'long words like floxinoxinihilipilification and antidisestablishmentarianism with your code 001/XYZ/0002/65432178' FROM DUAL UNION ALL
SELECT 'i would ?! like / to make * bb a8 001/XYZ/0002/65432178 thank you very much friends' FROM DUAL;

Затем приведенный выше код выдает:

CODE                        | VALUE                                                                                                            
:-------------------------- | :----------------------------------------------------------------------------------------------------------------
floxinoxinihilipilification | long words like floxinoxinihilipilification and antidisestablishmentarianism with your code 001/XYZ/0002/65432178
001/XYZ/0002/65432178       | i would ?! like / to make * bb a8 001/XYZ/0002/65432178 thank you very much friends                              

Вместо этого вы можете попытаться сделать что-то вроде возврата слова, содержащего более 20 символов, которое также имеет наибольшее количество / символов:

SELECT ( SELECT MAX( REGEXP_SUBSTR( d.value, '\S{20,}', 1, LEVEL ) ) KEEP ( DENSE_RANK LAST ORDER BY REGEXP_COUNT( REGEXP_SUBSTR( d.value, '\S{20,}', 1, LEVEL ), '/' ) )
         FROM   DUAL
         CONNECT BY LEVEL <= REGEXP_COUNT( d.value, '\S{20}' )
       ) AS code,
       value
FROM   data d;

Какие выходы:

CODE                  | VALUE                                                                                                            
:-------------------- | :----------------------------------------------------------------------------------------------------------------
001/XYZ/0002/65432178 | long words like floxinoxinihilipilification and antidisestablishmentarianism with your code 001/XYZ/0002/65432178
001/XYZ/0002/65432178 | i would ?! like / to make * bb a8 001/XYZ/0002/65432178 thank you very much friends                              

дБ <> скрипка здесь

0 голосов
/ 14 февраля 2019

Вы можете просто найти последовательность из 20+ экземпляров всего, кроме пробела:

select regexp_substr(
  'i would ?! like / to make * bb a8 001/XYZ/0002/65432178 thank you very much friends',
  '[^ ]{20,}') as result
from dual;

RESULT               
---------------------
001/XYZ/0002/65432178

[^ ] - это шаблон, который исключает пробелы;{20,} означает, что должно повторяться минимум 20 раз, без максимума.

Если вы хотите исключить любые пробелы - в случае, например, вместо пробела сразу перед или после есть вкладкачасть, которую вы хотите - вы можете использовать вместо этого класс символов:

regexp_substr(<your string>, '[^[:space:]]{20,}')

Как указывает @MTO, они будут соответствовать первой 20-символьной строке в значении, и вполне возможно, что введенный пользователем текст можетсодержат длинные не кодовые значения, которые вы на самом деле не хотите видеть.Было бы лучше, если бы вы могли сопоставить ожидаемый шаблон для кода.

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