Как правильно составить регулярное выражение? - PullRequest
0 голосов
/ 07 октября 2011

Мне нужно получить данные с позиции третьего появления «*» до 4-го.Я делаю так:

    with t as (select 'T*76031*12558*test*received percents' as txt from dual)
         select regexp_replace(txt, '.*(.{4})[*][^*].*$', '\1')
    from t

Я получаю "тест" - это правильно, но как получить любое количество символов, а не только 4?

Ответы [ 4 ]

2 голосов
/ 07 октября 2011

Это должно работать на примере, который вы использовали:

REGEXP_REPLACE( txt, '(^.*\*.*\*.*\*)([[:alnum:]]*)(\*.*$)', '\2')

Таким образом, SELECT будет:

WITH t 
  AS (SELECT 'T*76031*12558*test*received percents' AS txt FROM DUAL)
SELECT REGEXP_REPLACE( txt, '(^.*\*.*\*.*\*)([[:alnum:]]*)(\*.*$)', '\2')
  FROM t;

Регулярное выражение ищет:

Группа 1: начало строки. Любое количество символов до ''. Любые дальнейшие символы до другого ''. Любые последующие символы до третьего '*'.

Группа 2: Любые буквенно-цифровые символы

Группа 3: «*», За которым следуют любые другие символы до конца строки.

Заменить все вышеперечисленное тем, что было найдено в группе 2.

Надеюсь, это поможет.

EDIT: В продолжение замечательного ответа Роба ван Вейка из другой ветки здесь:

Извлечение подстроки из заданной строки

WITH t 
  AS (SELECT 'T*76031*12558*test*received percents' AS txt FROM DUAL)
SELECT REGEXP_SUBSTR( txt,'[^\*]+',1,4)
  FROM t;
2 голосов
/ 07 октября 2011

Как насчет следующего?

 ^([^*]*[*]){3}([^*]*)

Первая часть соответствует 3 группам *, а вторая часть соответствует всему до следующей * или конца строки.

1 голос
/ 07 октября 2011

Примечание: 10g REGEXP_SUBSTR не поддерживает возврат подвыражений, см. Комментарии ниже.

Если вы действительно выбираете только часть строки, я рекомендую использовать REGEXP_SUBSTR вместо.Я не знаю, эффективнее ли это, но лучше документирует ваше намерение:

SQL> select regexp_substr('T*76031*12558*test*received percents', 
                          '^([^*]*[*]){3}([^*]*)', 1, 1, '', 2) from dual;

REGEXP_SUBST
------------
test

Выше я использовал регулярное выражение, предоставленное Pieter-Bas.

См. Также http://www.regular -expressions.info / oracle.html

1 голос
/ 07 октября 2011

Вы предполагаете, что последний * из вашего текста также является четвертым. Если это предположение верно, то это:

\b\w*\b(?=\*[^*]*$)

Получит тебе то, что ты хочешь. Но, конечно, это соответствует только последнему слову между * перед последней звездой. Это соответствует только тесту в этом случае или любым другим символам слова внутри *.

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