【问题标题】:Oracle remove repeating charactersOracle删除重复字符
【发布时间】:2014-10-07 10:37:40
【问题描述】:

为了实现密码复杂性,我需要一个可以删除重复字符的函数(以便生成满足密码复杂性要求的密码)。所以像 weeeeee1 这样的字符串是不允许的,因为 e 是重复的。我需要一个函数来代替返回 we1,其中重复字符已被删除。必须使用 Oracle PL/SQL 或直接 sql。

我找到了Oracle SQL -- remove partial duplicate from string,但这不适用于我的 weeeeee1 测试用例,因为它只替换为一次迭代,因此返回 weee1。

我不是要测试没有重复的字符。我正在尝试将重复字符串更改为非重复字符串。

【问题讨论】:

  • 删除字符会不会有不符合其他要求的风险,特别是最小长度?如果一开始就看不到它是如何生成的,那么丢弃任何未通过任何测试的生成值并重新开始可能会更简单;取决于它们失败的频率、生成它们需要多长时间、是否能提供可接受的性能等等......
  • 真的是we1weeeeee1 更安全的密码吗?!?
  • 我将使用一个随机生成的数字。唯一的问题是删除可能的重复字符。所以长度和安全性不是问题。

标签: sql oracle plsql


【解决方案1】:

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

    【讨论】:

    • 我不想测试没有重复的字符。我正在尝试将重复字符串更改为非重复字符串。
    【解决方案3】:

    大概,

    1. 使用返回值(weee1)再次检查替换

    2. 取出单词的每个字母并检查整个单词是否存在超过 1 个。

    【讨论】:

    • 这个答案并不独立 - 您可以添加更多信息以便它可以单独处理这个问题吗?
    猜你喜欢
    • 2015-10-13
    • 2013-08-30
    • 1970-01-01
    • 2011-10-07
    • 2021-04-13
    • 2016-08-15
    • 2016-02-21
    • 1970-01-01
    相关资源
    最近更新 更多