【发布时间】:2016-01-13 18:20:29
【问题描述】:
上下文
我已经来回走了几个小时试图解决一些问题,但对结果仍然不满意。
我想从 UIDevice 获取英语和西班牙语的 iPhone 用户名。所以我想出了一个正则表达式来获取 ("Andres's 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;
}
实际问题
但是有没有更好的方法来获取匹配的子字符串,而不管使用的正则表达式的替代方法是什么?
希望我已经说清楚了,提前感谢您提供任何可能的帮助!
【问题讨论】:
标签: ios objective-c regex substring