2016-08-23 205 views
0

我有一個字符串(本例中爲HTML),其中包含用於顯示體育遊戲結果的相同模式。所以,HTML標籤是已知的,但每個遊戲的價值都不是。返回來自正則表達式模式匹配的結果

在Perl中,我們可以這樣做:

if ($content =~ /\<\/a\>\<br\>(\d+)\<\/span\>\<br\>(\d+)\-(\d+).+\<\/a\>\<br\>(\d+)\<\/span\>\<br\>(\d+)\-(\d+)/) { 
    $visitingTeamScore = $1; // $1 is the 1st matched digit 
    $visitingTeamWins = $2; // $2 is the 2nd matched digit 
    $visitingTeamLosses = $3; // Etc 
    $homeTeamScore = $4; 
    $homeTeamWins = $5; 
    $homeTeamLosses = $6; 
} 

返回的括號內數字,在這種情況下不同6點長度的總的整數。然後我們可以將這些匹配分配給變量。


從這個問題的答案:Swift Get string between 2 strings in a string,我有以下的銀行代碼:

extension String { 
    func sliceFrom(start: String, to: String) -> String? { 
     return (rangeOfString(start)?.endIndex).flatMap { sInd in 
      (rangeOfString(to, range: sInd..<endIndex)?.startIndex).map { eInd in 
       substringWithRange(sInd..<eInd) 
      } 
     } 
    } 
} 

let firstMatch = content?.sliceFrom("</a><br>", to: "</span>") // The first integer in the string 

這個問題來獲得第四整數這也是</a\><br></span>所以之間時結果匹配將再次成爲第一個數字。

我可以手動計數字符(這本身就不是一個完美的科學,因爲在每一個整數數字可能不同),做喜歡的事,醜陋:

let newRawHTML = content![content!.startIndex.advancedBy(15)...content!.startIndex.advancedBy(5)] 

另一種可能性是刪除任何東西從已經匹配字符串,使其對每個後續搜索都更短(我不知道如何實現)。要做到這一點,有什麼辦法?斯威夫特有什麼方法可以「拔出」比賽嗎?

回答

2

您作爲Perl示例顯示的代碼使用正則表達式。 如果模式有點複雜,最好直接使用NSRegularExpression

let pattern = "</a><br>(\\d+)</span><br>(\\d+)-(\\d+).+</a><br>(\\d+)</span><br>(\\d+)-(\\d+)" 
let regex = try! NSRegularExpression(pattern: pattern, options: []) 
if let match = regex.firstMatchInString(content, options: [], range: NSRange(0..<content.utf16.count)) { 
    let visitingTeamScore = (content as NSString).substringWithRange(match.rangeAtIndex(1)) 
    let visitingTeamWins = (content as NSString).substringWithRange(match.rangeAtIndex(2)) 
    let visitingTeamLosses = (content as NSString).substringWithRange(match.rangeAtIndex(3)) 
    let homeTeamScore = (content as NSString).substringWithRange(match.rangeAtIndex(4)) 
    let homeTeamWins = (content as NSString).substringWithRange(match.rangeAtIndex(5)) 
    let homeTeamLosses = (content as NSString).substringWithRange(match.rangeAtIndex(6)) 
    //...use the values 
} 
+0

我讀了一堆關於NSRegularExpression的問題/答案和文章,但我不明白如何使用它。這很好,謝謝! – Shades

+0

我在哪裏可以找到我的正則表達式中使用的Swift通配符字符列表? – Shades

+1

@Shades,請參閱[官方參考]的**正則表達式元字符**和**正則表達式運算符**部分(https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSRegularExpression_Class /index.html#//apple_ref/doc/uid/TP40009708)。 – OOPer