我有一个大而且不一致的文本块(我正在测试使用OCR和随机打印输出,但我的最终代码将使用驾驶执照或其他形式的ID)
我想在文本中搜索“name”或“1)之类的关键字”然后提取“AFTER”该关键字的所有内容,直到我到达断点或行尾。
我目前正在使用:
NSRegularExpression *regexp = [NSRegularExpression regularExpressionWithPattern:@"name: (.*?) Smith" options:NSRegularExpressionCaseInsensitive error:nil];
[regexp enumerateMatchesInString:tesseractText.text
options:0
range:NSMakeRange(0, tesseractText.text.length)
usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop)
{
NSRange group1 = [match rangeAtIndex:1];
tesseractText.text = [tesseractText.text substringWithRange:group1]; // changes textField to value of specific text
}
];
这只在提取名字时起作用(例如乔治),但当我试图获得“史密斯”时我试过了
NSRegularExpression *regexp = [NSRegularExpression regularExpressionWithPattern:@"name: (.*?) /n"
和
NSRegularExpression *regexp = [NSRegularExpression regularExpressionWithPattern:@"name: (.*?) "
但不起作用:(
因为我正在使用OCR,相机不会总是捕捉到“一切”,并且因为典型的ID将每条信息放在一个新行上,所以我没有“密钥”来捕获在文本之间,所以我要么得到文本“直到行尾”或新段落,或者不太理想,在关键字“name:”之后的固定数量的字符,它不会考虑不同的名称长度,但至少它会在一定程度上起作用。
如果在名称后使用固定数量的字符:为了避免越界,我可能需要计算一行中的字符数,但是再次,因为这是一个文本字段而不是单行标签,我我需要计算“只是”该行中的字符,而不是下一行。
如果我使用的代码可以调整得那么好,但是如果使用Objective C的方法完全不同,那么我愿意改写我迄今为止所做的工作以使这个功能正常工作
谢谢你的时间
答案 0 :(得分:1)
感谢Ken Thomases,我解决了这个问题,我的代码工作得很好,但是我用/ n而不是\ n
这样:
NSRegularExpression *regexp = [NSRegularExpression regularExpressionWithPattern:@"name: (.*?) \n" options:NSRegularExpressionCaseInsensitive error:nil];
有效,但我有一个新问题,我将作为一个新问题发布 如果“密钥”是一个数字,它将不起作用,例如
NSRegularExpression *regexp = [NSRegularExpression regularExpressionWithPattern:@"1 (.*?) \n" options:NSRegularExpressionCaseInsensitive error:nil];
它返回错误“Thread 1:signal SIGABRIT”这是有问题的,因为驾驶执照上出现的钥匙都是数字......所以现在我必须寻找替代方案