当前位置: 首页 > 知识库问答 >
问题:

模糊匹配字符串中字母相似的数字?[关闭]

孙自怡
2023-03-14
0 vs O
1 vs l
6 vs b
...

共有1个答案

潘佐
2023-03-14

我不确定这样的库是否存在,我也不确定我是否喜欢这些约束,但这里有一个选项可以做到这一点:

  1. 为相似字符定义映射(您选择这些字符),例如
    Map<Character, Character> replacements = new HashMap<>();
    replacements.put('G', '6');
    replacements.put('b', '6');
    replacements.put('I', '1');
    replacements.put('l', '1');
   char[] replaceSimilarChars(char[] input) {
        char[] replaced = Arrays.copyOf(input, input.length);
        for( int i = 0; i < replaced.length; i++) {
            Character replacementChar = replacements.get(replaced[i]);
            if( replacementChar != null) {
                replaced[i] = replacementChar;
            }
        }
        
        return replaced;
    }

   public void savePassword(char[] password) { //for security reasons don't use String directly
     String hash = hash(replaceSimilarChars(password));
     ... //save the hash
   }
   public boolean checkPassword(String userId, char[] password) {
     String existingHash = loadPwHash(userId);  
     String passedHash = hash(replaceSimilarChars(password));   

     return existingHash.equals(passHash);
   }

当然,这要求您能够直接影响PW保存和匹配。根据您的评论,您只能控制匹配过程,所以如果您可以从DB获得密码(尽管这不安全),只需在加载后应用替换:

public boolean checkPassword(String userId, char[] password) {
  char[] savedPW = loadPw(userId);  
  return Arrays.equals(replaceSimilarChars(savePW),
                       replaceSimilarChars(password));
}
 类似资料:
  • 我试图找出我的字符串是否包含从a到z的所有字母 我们可以通过其他方法解决这个问题,但我正在尝试仅使用模式和匹配器来解决它。

  • 问题内容: Python newb在这里。我试图计算给定字符串中字母“ a”的数量。代码如下。它会继续在字符串“ banana”中返回1而不是3。任何输入表示赞赏。 问题答案: 其他答案表明您的代码出了什么问题。但是,如果您不只是为了锻炼,还可以通过内置的方式进行此操作: Danben给出了以下更正版本: 还有其他一些方法,希望它们能教给您更多关于Python的知识! 类似,但循环更短。利用了布尔

  • 如何编写由字符组成但必须以相同字母开头和结尾的正则表达式?例如:

  • 问题内容: 我正在尝试为PHP中的名称编写一个合理的验证器,而我的第一次尝试包括以下模式: 最终将其传递给的呼叫。据我所知,这可以与您的原始ASCII字母一起使用,但似乎在诸如Ă或张之类的易变字符上起作用。 模式本身有问题吗?也许我期望做的工作比我想象的还要多? 还是与输入的传递方式有关?我不确定是否相关,但是我确实确保在表单页面上指定UTF8编码。 问题答案: 我认为问题要比这简单得多:您忘记了

  • 问题内容: 我想在输入字符串中搜索给定的字符串模式。 例如 现在,我需要搜索字符串URL是否包含“ ”。请帮我。 这是一个例子。实际上,我需要检查URL是否包含匹配“ / {a-zA-Z0-9} /”的字符串。 问题答案: 您可以为此使用类。如果您只想在中匹配单词字符,则可以使用以下正则表达式。是的简写。如果您可以,请使用或。

  • 例如,我们有一个字符串:asd/asd/asd/1#s_ 我需要匹配以下部分:/asd/1#s_或asd/1#s_如何使用普通正则表达式? 我试过像这样的消极前瞻,但它不起作用 它匹配这个“前缀/asd/1#s_”,我需要匹配“/asd/1#s_”中的这个“/asd/1#”,我需要匹配“/asd/1#s_”,而没有所有前面的 /asd/'s 匹配应该与普通正则表达式没有任何编程语言的任何帮助函数h