gpt4 book ai didi

ios - iOS 中的正则表达式

转载 作者:行者123 更新时间:2023-11-29 02:29:15 24 4
gpt4 key购买 nike

我正在尝试根据以下正则表达式验证字符串:

[(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z]).{6,20}]
  1. 如果使用 numberOfMatches 方法完成验证,则验证通过,如下所示:

    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@“[(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z]).{6,20}]” options:0 error:&error];
    NSUInteger numberOfMatches = [regex numberOfMatchesInString:string options:0 range:NSMakeRange(0, string.length)];

    BOOL status numberOfMatches == string.length;
  2. 如果验证是使用 NSPredicate 完成的,则验证失败:

    NSPredicate *test = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", [(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z]).{6,20}]];
    BOOL status = [test evaluateWithObject:string];

这是什么原因?我想使用 NSPredicate 来做到这一点。

最佳答案

[] 包围你的正则表达式是错误的,因为里面的所有内容都被解释为字符类的一部分。在你的情况下:

[(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z]).{6,20}]

是一个字符类,包含A-Z0-9a-z{}()?=.,*

因为 NSRegularExpression 使用的是 ICU 的正则表达式库,所以它支持字符类联合,就像在 Java 中一样。

正确的正则表达式应该是:

^(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z]).{6,20}$

你的第一段带有 NSRegularExpression 的代码应该是:

NSRegularExpression *regex = [NSRegularExpression
regularExpressionWithPattern:
@"^(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z]).{6,20}$"
options:0
error:&error];
NSUInteger numberOfMatches = [regex numberOfMatchesInString:string
options:0
range:NSMakeRange(0, string.length)];

BOOL status = numberOfMatches == 1;

由于正则表达式仅在匹配整个字符串时才匹配,因此您最多只能获得 1 个匹配项。

你的第二段带有 NSPredicate 的代码应该是:

NSPredicate *test = [NSPredicate predicateWithFormat:
@"SELF MATCHES %@",
@"'^(?=.*[A-Z])(?=.*[0-9])(?=.*[a-z]).{6,20}$'"];
BOOL status = [test evaluateWithObject:string];

请注意,除了转义 \ 之外,您必须为 String 对象字面量执行转义,您还需要 take care of another level of escaping for the string literal in predicate syntax (见示例)。幸运的是,我们在这里不必关心这个,因为您没有在正则表达式中使用 \

正则表达式不应该直接在格式字符串中指定(就像在以前的修订版中那样),因为它会导致格式字符串语法的另一个级别的转义。

关于ios - iOS 中的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27120541/

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