2013-12-20 2 views
0
substr(regexp_substr(data,':[^:]+:[^:]+:[^:]+*', 1, 1), 
     length(regexp_substr(data,':[^:]+:[^:]+:*', 1, 1)) + 6 
) 

Я не имею доступа к тому, что data в reg_substr представляют. Когда я пытаюсь проверить некоторые суровые (фиктивные) данные, я получаю null. Пожалуйста, объясните, что представляет собой выражение reg ':[^:]+:[^:]+:[^:]+*'. Спасибо.Для того, что делает regexpression ': [^:] +: [^:] +: [^:] + *' Матч

Какое значение имеет значение : в выражении reg.

+0

Все, что я вижу в Дрозды! – Liath

+0

@Liath, который является pacman fool – Prix

+0

'+ *' не должен быть юридическим символом, хотя '* +' является законным на некоторых языках. Я уверен, что это опечатка. – Jerry

ответ

1

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

:[^:]+:[^:]+:[^:]+* 

Матчи:

  • двоеточие : характер
  • Одно- или-больше символов, которые не являются двоеточие :
  • двоеточие : характер
  • Один или несколько символов w HICH не двоеточие :
  • двоеточия : характера
  • Любые один или-более символы, которые не являются двоеточием : тем * на конце означает, что этот предыдущий матч [^:]+ подобран нуль или-более раз.

[^:]+* допустим, но не имеет особый семантический смысл - вместо этого он может быть переписан в виде эквивалентного выражения [^:]* (Ноль-или-больше символов, которые не являются двоеточием :).

SQL Fiddle

Запрос 1:

WITH strings AS (
      SELECT ':abcd:efg:hijk' AS string FROM DUAL 
    UNION ALL SELECT 'test :1234:5:' FROM DUAL 
    UNION ALL SELECT '::x:y::' FROM DUAL 
) 
SELECT string, 
     REGEXP_SUBSTR(string, ':[^:]+:[^:]+:[^:]+*'), 
     REGEXP_SUBSTR(string, ':[^:]+:[^:]+:[^:]+'), 
     REGEXP_SUBSTR(string, ':[^:]+:[^:]+:[^:]*') 
FROM strings 

Results:

|   STRING | REGEXP_SUBSTR(STRING,':[^:]+:[^:]+:[^:]+*') | REGEXP_SUBSTR(STRING,':[^:]+:[^:]+:[^:]+') | REGEXP_SUBSTR(STRING,':[^:]+:[^:]+:[^:]*') | 
|----------------|---------------------------------------------|--------------------------------------------|--------------------------------------------| 
| :abcd:efg:hijk |        :abcd:efg:hijk |        :abcd:efg:hijk |        :abcd:efg:hijk | 
| test :1234:5: |         :1234:5: |          (null) |         :1234:5: | 
|  ::x:y:: |          :x:y: |          (null) |          :x:y: | 
+0

@MTO, поэтому вы хотите сказать, что первое и последнее выражение приводит к тому же шаблону ..!? – ethan

+0

Да '[^:] + *' будет искать '[^:] +' ноль или больше раз, поэтому будет искать пустую строку или '[^:] +' или '[^:] + [^ :] + '(это то же самое, что' [^:] + ') или' [^:] + [^:] + [^:] + '(что совпадает с' [^:] + ') и т. д. ... что функционально, точно так же, как '[^:] *'. – MT0

1

Колон не является особым. Это будет соответствовать одному двоеточию, за которым последует что-нибудь, а не двоеточие (несколько символов), за которым следует двоеточие, а затем ...

Я не уверен, что есть звездочка на конце - я не знаю Не думаю, что это имеет какой-то эффект (и это может быть ошибка).

Насколько я могу судить, эта команда вернет 6 символов, отформатированных: a: b: c (что означает:: [^:]: [^:]: [^:] 'будет эквивалентным регулярным выражением) ,

+1

Звездочка равна нулю или больше предыдущего, но «+» не имеет для меня смысла – Liath

+1

Я знаю, для чего * AN * звездочка. Я не знаю, для чего нужна * звездочка. ;) – DimeCadmium

+1

Я все еще говорю о космических захватчиках ;-) – Liath

1

Я просто попробовал это в онлайн-отладчике регулярных выражений, и вы можете увидеть результаты здесь http://regex101.com/r/vG5oV3 вместе с объяснением каждой части регулярного выражения.

Если вы используете регулярное выражение, как в вопросе, конец «+ *» не имеет никакого смысла и не является правильным регулярным выражением (как Liath упоминает в комментарии)

: за пределами [] является символом, который соответствует в выражении и [^:]+ означает совпадение от одного до неограниченных символов, которые не являются :

Так начинается с отысканием первого : затем сопоставляет все символы до тех пор, пока не найдет другой :, а затем делает это снова, три раза в общей сложности.

+0

В отладчике, о котором вы упоминали, отображается ошибка. но при запуске в sqlplus это не дает никакой ошибки, и результат будет таким же, как описано в вашем ответе. – ethan

+1

Значение '*' означает, что последнее выражение, в этом случае '[^:] +' должно повторяться 0 или более раз. На практике это отрицает последний '+', что делает его излишним. Регулярное выражение эквивалентно ': [^:] +: [^:] +: [^:] *'. –

1

Вот пример. Третий столбец является эквивалентом регулярное выражение, которое короче/яснее, на мой взгляд:

SQL> with t as 
    2 (select 'abc:de:fghijk:lmnopqrs:tuvw:xyz' data from dual union all 
    3 select 'abcde:fg:hi:jklmnopqr:s:tu:v:wxyz' from dual union all 
    4 select ':abcde:fg:hi:jklmnopqr:s:tu:v:wxyz' from dual 
    5 ) 
    6 select data 
    7  , substr 
    8   (regexp_substr(data,':[^:]+:[^:]+:[^:]+*', 1, 1) 
    9   , length(regexp_substr(data,':[^:]+:[^:]+:*', 1, 1)) + 6 
10  ) 
11  , substr(regexp_substr(data,':[^:]+',1,3),7) 
12 from t 
13/

DATA        SUBSTR(REGEXP_SUBSTR(DATA,':[^:]+: SUBSTR(REGEXP_SUBSTR(DATA,': 
---------------------------------- ---------------------------------- ---------------------------- 
abc:de:fghijk:lmnopqrs:tuvw:xyz qrs        qrs 
abcde:fg:hi:jklmnopqr:s:tu:v:wxyz opqr        opqr 
:abcde:fg:hi:jklmnopqr:s:tu:v:wxyz 

3 rows selected. 

С уважением,
Роб.

Смежные вопросы