2016-08-23 137 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