2016-08-23 7 views
0

스포츠 게임의 결과를 표시하는 데 동일한 패턴을 포함하는 문자열 (이 예의 경우 HTML)이 있습니다. 따라서 HTML 태그는 알려져 있지만 각 게임의 값은 아닙니다.정규식 패턴 일치 결과 반환

펄, 우리는이 작업을 수행 할 수 있습니다이 경우, 자리 다양한 길이의 총 6 개 정수를 괄호 안의 숫자를 반환

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; 
} 

합니다. 그런 다음 일치 항목을 변수에 할당 할 수 있습니다. 이 질문에 대한 답변에서


: 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> 사이도 4의 정수를 얻는 경우에 온다 결과 일치가 다시 첫 번째 숫자가됩니다.

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

또 다른 가능성에서 이미 일치하는 것을 제거하는 것입니다 :

나는 수동으로 문자를 (각 정수의 숫자가 다를 수 있기 때문에 어느 자체가 완벽한 과학이 아니다)과 같은 추한 뭔가를 셀 수 이 문자열은 이후 검색 할 때마다 짧아집니다 (구현 방법을 모르겠습니다). 어떻게해야할까요? Swift에서 경기를 "뽑아내는"방법이 있습니까?

답변

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