Ios 无法在目标C中创建正则表达式

Ios 无法在目标C中创建正则表达式,ios,objective-c,regex,Ios,Objective C,Regex,我有一个正则表达式来检查最多70个字母数字字符和特殊字符:'/\\-;@和空间,我使用以下正则表达式模式- ^[a-zA-Z0-9,.-\s'\\\/@]{0,70}$ 请注意:在中进行测试完全可以 并使用以下代码将其与字符串匹配- NSString *String = area@123\\ NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[a-zA-Z0-9,.-\s'\\\

我有一个正则表达式来检查
最多70个字母数字字符和特殊字符:'/\\-;@和空间
,我使用以下正则表达式模式-

^[a-zA-Z0-9,.-\s'\\\/@]{0,70}$
请注意:在中进行测试完全可以

并使用以下代码将其与字符串匹配-

NSString *String = area@123\\
NSRegularExpression *regex  = [NSRegularExpression regularExpressionWithPattern:@"^[a-zA-Z0-9,.-\s'\\\/@]{0,70}$" options:NSRegularExpressionCaseInsensitive error:&error];

NSAssert(regex, @"Unable to create regular expression");
NSRange textRange   = NSMakeRange(0, string.length);
NSRange matchRange  = [regex rangeOfFirstMatchInString:string options:NSMatchingReportProgress range:textRange];
最初它显示的是转义序列错误,为此我将模式更改为-
^[a-zA-Z0-9,.-\\s'\\\\/@]{0,70}$

现在它导致了消息崩溃-

Assertion failure in +[UMValidations validateString:withPattern:]
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Unable to create regular expression

现在,当这个模式在正则表达式测试仪上运行良好时,会发生什么错误。

当您在Objective-C中编写正则表达式模式时,带有特殊字符的反斜杠必须加倍。此外,还需要转义连字符(或将其放置在字符类的开始/结束处)

您不需要转义
/
。您需要使用4个反斜杠来定义文字
\
,因为正则表达式引擎使用文字反斜杠(在定义为
“\\\”
的Objective-C字符串文字中)来转义特殊字符并表示文字
\
,因此Objective-C字符串文字中的文字反斜杠必须加倍(
\\
文本字符串模式(定义为
“\\\\\”
)中的
\
将匹配输入中的文本
\
)。要点是字符串文本中的
\
可以形成一个转义序列,如
“\n”
(换行符)或
“\r”
(回车符)因此,有两层转义:一层用于Objective-C引擎,另一层用于regex(本例中为ICU)库

见:


请为您正在使用的正则表达式提供字符串文字。问题很可能是由于后斜杠造成的。在工作中有几个级别的转义:Objective-C、正则表达式和文字使用。因此,显示表达式在代码中的显示方式很重要。只需转义破折号或将其放在代码的开头或结尾character class.Hi.我已经更新了我的代码结构。请检查。您能解释一下背后的机制吗?您需要使用4个反斜杠来定义一个文字\。Thanksimply in C string literals
“\”
具有空间意义。要以字符串文字形式提供此字符,您必须使用
“\\”
。在正则表达式中,这个字符也有空间意义,因此您最后只能使用
“\\\\\”
来匹配单斜杠。我通过一个小演示添加了一些解释。请注意,我删除了
a-Z
,只是因为使用了不区分大小写的修饰符
(?I)
@"^[a-zA-Z0-9,.\\-\\s'\\\\/@]{0,70}$"
               ^^ ^^  ^^^^
NSString *String = @"area@123\\";
NSRegularExpression *regex  = @"(?i)^[a-z0-9,.\\-\\s'\\\\/@]{0,70}$";
NSPredicate * Test = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
if ([Test evaluateWithObject:String]) {
    NSLog (@"yes");
} else {
    NSLog (@"no");
}