【问题标题】:Return results from regular expression pattern matching从正则表达式模式匹配返回结果
【发布时间】:2016-08-23 21:10:56
【问题描述】:

我有一个字符串(在本例中为 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,我有以下 Swift 代码:

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

当获得第 4 个整数时出现问题,该整数也在 &lt;/a\&gt;&lt;br&gt;&lt;/span&gt; 之间,因此结果匹配将再次成为第一个数字。

我可以手动计算字符数(这本身并不是一门完美的科学,因为每个整数中的数字可能不同)来做一些丑陋的事情,比如:

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

另一种可能性是从字符串中删除已经匹配的任何内容,使其每次搜索都更短(我不确定如何实现。)这样做的方法是什么? Swift 中有什么方法可以“拔出”匹配项吗?

【问题讨论】:

    标签: swift pattern-matching


    【解决方案1】:

    您作为 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
    }
    

    【讨论】:

    • 我阅读了一堆关于 NSRegularExpression 的问题/答案和文章,但我不明白如何使用它。太好了,谢谢!
    • 在哪里可以找到要在正则表达式中使用的 Swift 通配符列表?
    • @Shades,参见the official reference正则表达式元字符正则表达式运算符部分。
    猜你喜欢
    • 2016-01-22
    • 2018-01-15
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2022-01-14
    相关资源
    最近更新 更多