【问题标题】:Get substring using regex in Objective-C?在 Objective-C 中使用正则表达式获取子字符串?
【发布时间】: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


    【解决方案1】:

    我会尽快回答您的问题,但首先通过以下方式进行一些增强:

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

    【讨论】:

    • 感谢您的改进。我完全忽略了大写的事情:我确实设置了不区分大小写的选项,但忘记更新表达式。好收获!
    • 关于这个问题,如果我匹配!.range ([match range] in objc) 我得到了字符串的全部范围,而不是匹配的表达式。
    猜你喜欢
    • 2019-05-02
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 2017-06-07
    • 2011-06-26
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    相关资源
    最近更新 更多