[英]Get substring using regex in Objective-C?
语境
我来回走了两个小时,试图解决问题,但仍然对结果不满意。
我想从UIDevice获取英语和西班牙语的iPhone用户名。 因此,我想出了一个正则表达式来获取(“ Andres的iPhone”>“ Andres”)和(“ iPhone de Andres”>“ Andres”)。
魔术是这样的:
"(?:iPhone|iphone|phone|iPad|ipad|pad|iPod|ipod|pod)(?:\\\\s+\\\\S+)*\\\\s+de\\\\s+(.+)|"
"(.+)'s\\\\s+(?:iPhone|iphone|phone|iPad|ipad|pad|iPod|ipod|pod)(?:\\\\s+\\\\S+)*"
问题
尝试从[[UIDevice currentDevice] name]
获取子字符串时,用户名可以通过正则表达式中的两个替代之一进行匹配。
这导致实际名称可能通过以下方式获得:
[[regEx firstMatchInString:str options:0 range:NSMakeRange(0, [str length])] rangeAtIndex:1]
如果第一个备选方案匹配; 但是,如果第二个替代方案执行匹配,则为:
[[regEx firstMatchInString:str options:0 range:NSMakeRange(0, [str length])] rangeAtIndex:2]
注意,根据替代匹配,我必须获取第一个索引或第二个索引。 目前,我通过以下方法解决了这个问题:
+ (NSString *)getSubstringInString:(NSString *)str matchedByRegEx:(NSRegularExpression *)regEx
{
NSString * result = nil;
NSTextCheckingResult * match = [regEx firstMatchInString:str options:0 range:NSMakeRange(0, [str length])];
for (int i=1; i<[match numberOfRanges]; i++) {
NSRange matchRange = [match rangeAtIndex:i];
if (!NSEqualRanges(matchRange, NSMakeRange(NSNotFound, 0))) {
result = [str substringWithRange:matchRange];
}
}
return result;
}
实际问题
但是,有没有一种更好的方法来获取匹配的子字符串,而不考虑使用的正则表达式的替代方法是什么?
希望我已经说清楚了,在此先感谢您提供的任何帮助!
我将很快回答您的问题,但首先使用以下方法进行一些增强:
options: .CaseInsensitive
使用NSRegularExpression
可以避免在不使用大小写的情况下使用表达式。
所以这
(?:iPhone|iphone|phone|iPad|ipad|pad|iPod|ipod|pod)
变成
(?:iphone|phone|ipad|pad|ipod|pod)
接下来是增强功能, i
作为可选选项,您仍然可以匹配其他选项,例如:
[i]*(phone|pad|pod)
您现在需要的表达式可能如下所示:
(?>[i]*(?:phone|pad|pod)\s*de\s)(.+)|(.+)(?='s\s[i]*phone|pad|pod)
最后一点是:
let sample:String = "Andres's iPhone"
let regex = try! NSRegularExpression(pattern: "(?>[i]*(?:phone|pad|pod)\\s*de\\s)(.+)|(.+)(?='s\\s[i]*phone|pad|pod)"
, options: NSRegularExpressionOptions.CaseInsensitive)
let match = regex.firstMatchInString(sample, options: [], range: NSRange(location: 0, length: sample.characters.count))
print((sample as NSString).substringWithRange(match!.range))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.