Objective c 无法使用NSRegularExpression提取信息
我正在开发一个iPhone应用程序,它将使用NSRegularExpression从字符串中匹配模式以提取信息。在这里,我试图从电子邮件标题中提取mailTo链接。我已成功检索电子邮件标题字符串,现在我正在使用NSregularExpression应用搜索模式以从标题字符串获取电子邮件id 这是我要从中提取邮件收件人的标题文本: 列表取消订阅:?主题=取消订阅>,> 这是搜索模式:Objective c 无法使用NSRegularExpression提取信息,objective-c,Objective C,我正在开发一个iPhone应用程序,它将使用NSRegularExpression从字符串中匹配模式以提取信息。在这里,我试图从电子邮件标题中提取mailTo链接。我已成功检索电子邮件标题字符串,现在我正在使用NSregularExpression应用搜索模式以从标题字符串获取电子邮件id 这是我要从中提取邮件收件人的标题文本: 列表取消订阅:?主题=取消订阅>,> 这是搜索模式: mailto:(?<address>[^\?^>]+)\??(?<params>[^
mailto:(?<address>[^\?^>]+)\??(?<params>[^>]+)?
mailto:(?[^\?^>]+)\?(?[^>]+)?
我的代码是这样的
NSString *str= @"List-Unsubscribe: <mailto:suksh-1142-5451-d8135921c2e2d40400ab02fa31eda529@usub.mailserv.in>?subject=Unsubscribe>,<http://suksh.mailserv.in/suksh/?p=unsubscribe&mid=5451&uid=d8135921c2e2d40400ab02fa31eda529>>";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"mailto:(?<address>[^\?^>]+)\??(?<params>[^>]+)?"];
NSRange rangeOfFirstMatch = [regex rangeOfFirstMatchInString:str options:0 range:NSMakeRange(0, [str length])];
if (!NSEqualRanges(rangeOfFirstMatch, NSMakeRange(NSNotFound, 0))) {
NSString *substringForFirstMatch = [str substringWithRange:rangeOfFirstMatch];
NSLog(@"Extracted URL: %@",substringForFirstMatch);
}
NSString*str=@“列表取消订阅:?主题=取消订阅>,>”;
NSRegularExpression*regex=[NSRegularExpression regular expression with pattern:@“mailto:(?[^\?^>]+)\?(?[^>]+)?”;
NSRange rangeOfFirstMatch=[regex rangeOffirstMatchString:str选项:0范围:NSMakeRange(0,[str长度])];
如果(!NSEqualRanges(rangeOfFirstMatch,NSMakeRange(NSNotFound,0))){
NSString*substringForFirstMatch=[str substringWithRange:rangeOfFirstMatch];
NSLog(@“提取的URL:%@”,子字符串为FirstMatch);
}
但是,当我要借助regularExpressionWithPattern:
创建NSRegularExpression对象时,它将返回nil对象
请帮我解决什么问题
提前感谢将对模式字符串进行两次处理:一次由编译器处理,然后由
NSRegularExpression处理。您必须转义反斜杠,以确保编译器不会处理每个“\?”
nor文档都没有提到对命名捕获组的支持((?模式)
);这可能会导致模式解析失败或匹配失败
创建正则表达式时使用,以便获取对象,该对象将告诉您构造失败的原因
NSError *theError;
// '?\?(' is to prevent '??(' from being interpreted as a trigraph
NSString *pattern = @"mailto:(?<address>[^\\?^>]+)\\?\?(?<params>[^>]+)?";
NSRegularExpression *regex;
NSRange rangeOfFirstMatch;
regex = [NSRegularExpression regularExpressionWithPattern:pattern
options:0 error:&theError];
if (regex) {
rangeOfFirstMatch = [regex rangeOfFirstMatchInString:str
options:0 range:NSMakeRange(0, [str length])];
if (!NSEqualRanges(rangeOfFirstMatch, NSMakeRange(NSNotFound, 0))) {
NSString *substringForFirstMatch = [str substringWithRange:rangeOfFirstMatch];
NSLog(@"Extracted URL: %@",substringForFirstMatch);
}
} else {
// couldn't compile RE
NSAlert *errorAlert;
if (theError) {
errorAlert = [NSAlert alertWithError:theError];
} else {
NSString *errorMsg = @"Couldn't parse unsubscribe header because the pattern /%@/ isn't a valid regular expression.";
errorAlert = [NSAlert
alertWithMessageText:@"Invalid Pattern"
defaultButton:nil
alternateButton:nil
otherButton:nil
informativeTextWithFormat:[NSString stringWithFormat:errorMsg, pattern]];
}
[theAlert runModal]; // Ignore return value.
}
n错误*错误;
//“?\?(”是为了防止“?(”被解释为三角图
NSString*模式=@“mailto:(?[^\\?^>]+)\?\?(?[^>]+)?”;
NSRegularExpression*regex;
NSRange rangeOfFirstMatch;
regex=[NSRegularExpression regular expressionwithpattern:pattern
选项:0错误:&错误];
if(正则表达式){
rangeOfFirstMatch=[regex rangeOfFirstMatch字符串:str
选项:0范围:NSMakeRange(0,[str长度]);
如果(!NSEqualRanges(rangeOfFirstMatch,NSMakeRange(NSNotFound,0))){
NSString*substringForFirstMatch=[str substringWithRange:rangeOfFirstMatch];
NSLog(@“提取的URL:%@”,子字符串为FirstMatch);
}
}否则{
//无法重新编译
NSAlert*错误警报;
如果(错误){
errorAlert=[NSAlert alertWithError:theError];
}否则{
NSString*errorMsg=@“无法分析取消订阅标头,因为模式/%@/不是有效的正则表达式。”;
errorAlert=[NSAlert
alertWithMessageText:@“无效模式”
默认按钮:无
备选按钮:无
其他按钮:无
informativeTextWithFormat:[NSString stringWithFormat:errorMsg,pattern]];
}
[theAlert runModal];//忽略返回值。
}
不确定这是否是唯一的问题,但您没有逃脱正则表达式中的反斜杠。此外,没有regularExpressionWithPattern:
方法,它被称为regularExpressionWithPattern:options:error:
参数,并且error
参数应该能让您了解表达式的错误。