2016-03-17 46 views
0

我是新來的正則表達式。我在SQL查詢中使用正則表達式。並且要顯示包含以下內容之外的所有記錄:字母數字字符,白色空格,字符串之間的連字符( - ),最後和字符串之間的點(。)。 我已經能夠做字母數字字符和空格。但連字符和點正在產生問題。什麼將是正則表達式允許字母數字字符,空格,介於兩者之間,點在最後或之間

例如:「first.name」,「firstname」。不應該來,但「名字」應該在結果。

「名字」不應該出現,而是「 - firstname」和「firstname-」應該出現在結果中。

截至目前我已經做到了這一點。

SELECT * FROM my_table WHERE column1 like '.%' or column1 like '-%' or 
regexp_like(column1 ,'[^[:alnum:]^[:blank:]]'); 

上述查詢的工作方式是它允許在字符串中的任意位置使用點和連字符。如上所述,不是我想要的地方。

任何人都可以幫助我。

+0

你說*不是字母數字*,但例子是'.firstname'。這不清楚。也許你只需要'REGEXP_LIKE(column1,'^ [.-]?[[:alnum:] [:blank:]] + - ?$')'? –

+0

,因爲.firstname在開頭有點。所以這就是爲什麼它應該填充。 –

回答

1

我嘗試了一大堆的解決方案。最後,下面就是我想要的方式。

SELECT * FROM my_table WHERE (INSTR(column1,'.', 1, 1))=1 
or (INSTR(column1,'-', 1, 1))=1 or (INSTR(column1,'-', 1,1)=length(column1)) 
or (REGEXP_LIKE(column1,'[^[:alnum:]^[:blank:]-.]')); 
1

我已經創建表就像你和本聲明

select * from tmp where x like '.%' OR x like '-%' or x like '%-'; 

作品完美的罰款 - 只。和 - :)

+0

我已經試過了。這將允許在任何位置的點和連字符 –

+0

@Anant,你確定你的要求是正確的嗎? –

1

我確認米哈爾解決方案:

SELECT * FROM 
      (select 'first.name' x from dual 
    union all select 'firstname.' from dual 
    union all select '.firstname' from dual 
    union all select 'first-name' from dual 
    union all select 'firstname-' from dual 
    union all select 'firs#@tname' from dual 
    union all select 'firs tname' from dual 
    union all select '#@hh tname' from dual 
    union all select '-firstname' from dual 
    union all select 'firstname' from dual) 
where x like '.%' OR x like '-%' or x like '%-' 
or (regexp_like(x ,'[^[:alnum:]^[:blank:]]') and x not like '%-%' and x not like '%.%') 
; 

通往

.firstname 
firstname- 
firs#@tname 
#@hh tname 
-firstname 
+0

我必須與正則表達式一起使用它。並將其與正則表達式中的字母數字字符和空格一起使用。不會給出想要的結果 –

+0

也許你想排除條款第二部分中的'-'和'''...解決方案更新。但是你的要求並不完全清楚。我建議你給一個更大的集合和預期的結果。 –

1

我相信這可以寫成一個單一的正則表達式,而不訴諸LIKE操作:

SELECT * FROM mytable 
WHERE REGEXP_LIKE(column1 ,'(^[.-]|-$)|[^a-zA-Z0-9 \t.-]') 

這裏正則表達式正在尋找下列模式匹配的字符串:

  • .-開頭或以-結尾
  • 包含比字母(a-zA-Z)或數字(0-9)或空間/標籤以外的字符(這是什麼POSIX類[:blank:]是,相對於[:space:]這是所有空格)或.-

請參閱SQL Fiddle here。請注意,我使用了與接受答案中相同的測試數據。

相關問題