gpt4 book ai didi

ios - 在 Objective-C 中使用正则表达式获取子字符串?

转载 作者:行者123 更新时间:2023-11-29 01:19:30 25 4
gpt4 key购买 nike

上下文

我已经来来回回几个小时试图解决一些问题,但我对结果仍然不满意。

我想从 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;
}

实际问题

但是有没有更好的方法来获取匹配的子字符串,而不管使用的正则表达式的替代方法是什么?

希望我已经说清楚了,在此先感谢您提供的任何可能的帮助!

最佳答案

我将很快回答您的问题,但首先使用以下方法进行一些增强:

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))

关于ios - 在 Objective-C 中使用正则表达式获取子字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34774188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com