dougong2306 2019-04-20 02:51
浏览 194
已采纳

在Golang中使用正则表达式确保特定的字符在字符串中,而不管位置如何

I am building a super simple function to ensure a password contains specific characters. Namely, the password should have the following:

  • One lowercase letter
  • One uppercase letter
  • One digit
  • One special character
  • No white space, #, or |

I thought regex would be the simplest way to go about doing this. But, I am having a hard time figuring out how to do this in Golang. Currently, I have a bunch of separate regex MatchString functions which I will combine to get the desired functionality. For example:

lowercaseMatch := regexp.MustCompile(`[a-z]`).MatchString
uppercaseMatch := regexp.MustCompile(`[A-Z]`).MatchString
digitMatch := regexp.MustCompile(`\d`).MatchString
specialMatch := regexp.MustCompile(`\W`).MatchString
badCharsMatch := regexp.MustCompile(`[\s#|]`).MatchString
if (lowercaseMatch(pwd) 
        && uppercaseMatch(pwd) 
        && digitMatch(pwd)
        && specialMatch(pwd)
        && !badCharsMatch(pwd)) {
    /* password OK */
} else {
    /* password BAD */
}

While this makes things pretty readable, I would prefer a more concise regex, but I don't know how to get regex to search for a single character of each of the above categories (regardless of position). Can someone point me in the right direction of how to achieve this? Additionally, if there is a better way to do this than regex, I am all ears.

Thanks!

  • 写回答

1条回答 默认 最新

  • doubi8965 2019-04-20 03:28
    关注

    Since golang use re2, it doesn't support positive-lookahead (?=regex), so I'm not sure if there is a way to write a regex that cover all cases.

    Instead, you can use unicode package:

    func verifyPassword(s string) bool {
        var hasNumber, hasUpperCase, hasLowercase, hasSpecial bool
        for _, c := range s {
            switch {
            case unicode.IsNumber(c):
                hasNumber = true
            case unicode.IsUpper(c):
                hasUpperCase = true
            case unicode.IsLower(c):
                hasLowercase = true
            case c == '#' || c == '|':
                return false
            case unicode.IsPunct(c) || unicode.IsSymbol(c):
                hasSpecial = true
            }
        }
        return hasNumber && hasUpperCase && hasLowercase && hasSpecial
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图