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

我沒有獲得什麼datareg_substr代表。當我試圖檢查一些任意的(虛擬)數據時,我得到了null。請解釋一下例子中reg表達式':[^:]+:[^:]+:[^:]+*'代表什麼。謝謝。要什麼是regexpression ':[^:] +:[ - ^:] +:[ - ^:] + *' 匹配

:在reg表達式中有什麼意義。

+0

所有我看到的是太空侵略者! – Liath

+0

@Lath這是pacman傻瓜 – 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

Yes'[^:] + *'會查找[[:] +'零次或多次,因此會查找空字符串或'[^:] +'或'[^:] + [^ :] +'(與[^:] +'相同或者[^:] + [^:] + [^:] +'(與[^:] +'相同)等等......這在功能上與'[^:] *'完全相同。 – MT0

1

冒號並不特殊。這將匹配一個單一的冒號,其次是任何不是冒號(多個字符),然後是一個冒號,然後是...

我不確定最後的星號是什麼 - 我不知道認爲它沒有任何作用(這可能是一個錯誤)。

據我所知,這個命令將返回6個字符格式:a:b:c(這意味着':[^:]:[^:]:[^:]'將是一個等效的正則表達式) 。

+1

星號是前面的0或更多,但'+ *'對我沒有意義 – 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. 

問候,
羅布。