gpt4 book ai didi

regex - 正则表达式或条件不适用于 Swift 但适用于在线调试器

转载 作者:可可西里 更新时间:2023-11-01 00:56:45 25 4
gpt4 key购买 nike

我正在尝试检查字符串是否包含一个额外的字符或一位数字。但出于某种原因,它在 Swift 中不起作用,但它适用于在线调试器/编辑器。

这是我的正则表达式:^(?=.*[a-z])(?=.*[$@$#!%*?&])|(?=.*[0-9]) .{6,}

据我了解:

^ - this is start anchor
(?=.*[a-z]) - string has one character
(?=.*[$@$#!%*?&]) - string has one special character
(?=.*[0-9]) - string has one digit
{6,} - string length is at least 6

并且在正则表达式验证中,常规 | 符号表示 OR 条件。

我的问题是为什么输出不是我想要的?

stackoverflow - false
stackoverflow1 - true
stackoverflow@ - false // should be true
stackoverflow1@ - false // should be true

这是我在 swift 中所做的:

func isPasswordValid(_ password : String) -> Bool{
let passwordTest = NSPredicate(format: "SELF MATCHES %@", "^(?=.*[a-z])(?=.*[$@$#!%*?&])|(?=.*[0-9]).{6,}$")
return passwordTest.evaluate(with: password)
}

明确地说,这就是我想要的:字符串必须至少有 6 个字符长,并且至少有一个数字或额外字符。最好不要将字符限制为 (?=.*[$@$#!%*?&])

最佳答案

您匹配的模式:1) 包含至少 1 个小写 ASCII 字母和至少 1 个 [...] 中的特殊字符的字符串的开头,2) 或匹配至少有一位数字的 6 个或更多字符的字符串。

此外,请注意 MATCHES 模式需要匹配整个字符串,这是您的模式在 Swift 中失败的主要原因。

您似乎想要匹配一个包含 6 个或更多字符的字符串,并且应该至少包含 1 个数字或一个特殊字符(我看到它可以是标点符号或符号)。

所以,你需要使用

"(?=.*[0-9\\p{S}\\p{P}]).{6,}"

参见 regex demo .不需要 ^$,因为 MATCHES 模式需要完整的字符串匹配。

图案细节

  • (?=.*[0-9\\p{S}\\p{P}]) - 一个积极的前瞻,要求应该有一个 ASCII 数字 ( 0-9)、标点符号 (\p{P}) 或一个符号 (\p{S}) 在除换行符之外的任何 0+ 个字符之后字符(在模式前添加 (?s) 以允许 . 匹配换行字符)
  • .{6,} - 任意六个或更多字符。

关于regex - 正则表达式或条件不适用于 Swift 但适用于在线调试器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45546650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com