2014-10-07 102 views
2

爲了實現密碼的複雜性,我需要一個可以刪除重複字符的函數(以便生成符合密碼複雜度要求的密碼)。所以像weeeeee1這樣的字符串將不會被允許,因爲e被重複。我需要一個返回we1的函數,其中重複的字符已被刪除。必須使用Oracle PL/SQL或直接sql。Oracle刪除重複字符

我發現Oracle SQL -- remove partial duplicate from string,但這不適用於我的weeeeee1測試用例,因爲它只替換一個迭代,因此返回weee1。

我不想測試沒有重複的字符。我試圖將重複的字符串變成非重複的字符串。

+0

不會刪除字符冒這個險沒有其他的要求,尤其是最小的長度?沒有看到它是如何產生的,放棄任何測試失敗並重新開始的生成值可能會更簡單;取決於他們多久失敗一次,他們需要多長時間才能生成,是否可以提供可接受的性能等等。 – 2014-10-07 10:39:28

+1

真的'we1'是比'weeeeee1'更安全的密碼嗎?!? – 2014-10-07 10:42:32

+0

我將使用隨機生成的數字。然後唯一的問題是刪除可能的重複字符。所以長度和安全性不是問題。 – Superdooperhero 2014-10-07 10:46:34

回答

6

我認爲你可以使用regexp_replace實現你的目標。或者我錯過了什麼?

select regexp_replace(:password, '(.)\1+','\1') 
    from dual; 

下面是一個例子:

with t as (select 'weeee1' password from dual 
      union select 'wwwwweeeee11111' from dual 
      union select 'we1' from dual) 

select regexp_replace(t.password, '(.)\1+','\1') 
    from t; 

生產:

REGEXP_REPLACE(T.PASSWORD,'(.)\1+','\1') 
we1 
we1 
we1 
1

試試這個:

select regexp_replace('weeeeee1', '(.)\1+', '\1') val from dual 

VAL 
--- 
we1 
+0

我不想測試沒有重複的字符。我試圖將重複的字符串變成非重複的字符串。 – Superdooperhero 2014-10-07 10:45:00

+0

查看我的更新信息 – zaratustra 2014-10-07 11:04:29

0

也許,

  1. 使用返回值(weee1)再次檢查和更換

  2. 取詞的每個字母,並在整個檢查這個詞超過1個存在與否。

+0

這個答案並不是孤立的 - 您能否添加更多的信息,以便能夠孤立地解決問題? – GHC 2014-10-07 10:54:50