2016-01-13 195 views
0

語境在Objective-C中使用正則表達式獲取子字符?

我已經回去&來回了幾個小時試圖解決的東西,現在還不能滿意的結果。

我想獲得一個iPhone的距離的UIDevice的用戶名都用英語和西班牙語。所以我想出了一個正則表達式(「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; 
} 

實際問題

但有一個更好的方式來獲得匹配的字符串,無論是什麼從正則表達式的替代使用呢?

希望我已經說清楚了,在此先感謝任何可能的幫助!

回答

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

感謝您的改進。我完全忽略了帽子的事情:我設置了不區分大小寫的選項,但忘了更新表達式。接得好! –

+0

關於這個問題,如果我確實匹配!.range(objc中的[匹配範圍]),我得到字符串的全部範圍,而不是匹配的表達式。 –

相關問題