Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 无法使用NSRegularExpression提取信息_Objective C - Fatal编程技术网

Objective c 无法使用NSRegularExpression提取信息

Objective c 无法使用NSRegularExpression提取信息,objective-c,Objective C,我正在开发一个iPhone应用程序,它将使用NSRegularExpression从字符串中匹配模式以提取信息。在这里,我试图从电子邮件标题中提取mailTo链接。我已成功检索电子邮件标题字符串,现在我正在使用NSregularExpression应用搜索模式以从标题字符串获取电子邮件id 这是我要从中提取邮件收件人的标题文本: 列表取消订阅:?主题=取消订阅>,> 这是搜索模式: mailto:(?<address>[^\?^>]+)\??(?<params>[^

我正在开发一个iPhone应用程序,它将使用NSRegularExpression从字符串中匹配模式以提取信息。在这里,我试图从电子邮件标题中提取mailTo链接。我已成功检索电子邮件标题字符串,现在我正在使用NSregularExpression应用搜索模式以从标题字符串获取电子邮件id

这是我要从中提取邮件收件人的标题文本:

列表取消订阅:?主题=取消订阅>,>

这是搜索模式:

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
参数应该能让您了解表达式的错误。