繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM