一尘不染

如何使用正则表达式分割字符串

swift

我有一个字符串,"323 ECO Economics Course 451 ENG English Course 789 Mathematical Topography"我想使用regex表达式拆分此字符串,[0-9][0-9][0-9][A-Z][A-Z][A-Z]以便该函数返回数组:

Array = 
["323 ECO Economics Course ", "451 ENG English Course",  "789 Mathematical Topography"]

我将如何使用Swift进行此操作?

编辑 我的问题不同于链接的问题。我意识到您可以使用迅速拆分字符串myString.components(separatedBy: "splitting string")。问题是该问题没有解决如何制作splitting string正则表达式的问题。我尝试使用,mystring.components(separatedBy: "[0-9][0-9][0-9][A-Z][A-Z][A-Z]", options: .regularExpression)但是没有用。

如何使该separatedBy:部分成为正则表达式?


阅读 339

收藏
2020-07-07

共1个答案

一尘不染

Swift到目前为止还没有本地正则表达式。但Foundation提供NSRegularExpression

import Foundation

let toSearch = "323 ECO Economics Course 451 ENG English Course 789 MAT Mathematical Topography"

let pattern = "[0-9]{3} [A-Z]{3}"
let regex = try! NSRegularExpression(pattern: pattern, options: [])

// NSRegularExpression works with objective-c NSString, which are utf16 encoded
let matches = regex.matches(in: toSearch, range: NSMakeRange(0, toSearch.utf16.count))

// the combination of zip, dropFirst and map to optional here is a trick
// to be able to map on [(result1, result2), (result2, result3), (result3, nil)]
let results = zip(matches, matches.dropFirst().map { Optional.some($0) } + [nil]).map { current, next -> String in
  let range = current.rangeAt(0)
  let start = String.UTF16Index(range.location)
  // if there's a next, use it's starting location as the ending of our match
  // otherwise, go to the end of the searched string
  let end = next.map { $0.rangeAt(0) }.map { String.UTF16Index($0.location) } ?? String.UTF16Index(toSearch.utf16.count)

  return String(toSearch.utf16[start..<end])!
}

dump(results)

运行此将输出

▿ 3 elements
  - "323 ECO Economics Course "
  - "451 ENG English Course "
  - "789 MAT Mathematical Topography"
2020-07-07