Oracle去除重复字符

4
为了实现密码复杂度,我需要一个函数来删除重复字符(以生成符合密码复杂度要求的密码)。因此,像weeeeee1这样的字符串将不被允许,因为e被重复使用了。我需要一个函数,它将返回we1,其中已经删除了重复的字符。必须使用Oracle PL/SQL或直接sql。
我找到了Oracle SQL -- remove partial duplicate from string,但这对我的weeeeee1测试用例无效,因为它只替换了一次迭代,因此返回weee1。
我不是在测试没有重复字符。我试图将重复字符的字符串更改为非重复字符的字符串。

删除字符不会冒险失败其他要求,特别是最小长度吗?如果没有看到它是如何生成的,可能更简单的方法是丢弃任何未通过任何测试的生成值并重新开始;这取决于它们失败的频率,需要多长时间来生成,是否提供可接受的性能等等... - Alex Poole
1
“we1” 真的比 “weeeeee1” 更安全吗?! - Sylvain Leroux
我将使用一个随机生成的数字。唯一的问题是如何去除可能重复的字符。因此,长度和安全性不是问题。 - Superdooperhero
3个回答

7
我认为您可以使用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

2

试试这个:

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

VAL
---
we1

我不是在尝试测试没有重复字符。我正在尝试将一个重复字符的字符串转换为一个非重复字符的字符串。 - Superdooperhero

0

可能,

  1. 使用返回的值(weee1)再次进行检查并替换。

  2. 取出单词的每个字母,并在整个单词中检查是否存在多个。


这个答案不能独立存在 - 你能添加更多信息,使它能够与问题孤立地存在吗? - GHC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接