как взять строку между шаблонами [duplicate]

Для пользовательской метки времени из отметки времени UNIX я использовал это в сценариях до:

import os, datetime

datetime.datetime.fromtimestamp(float(os.path.getmtime("FILE"))).strftime("%B %d, %Y")

Выход:

'26 декабря 2012 г.

23
задан alp 30 July 2015 в 13:41
поделиться

6 ответов

Я бы использовал регулярное выражение для извлечения подстрок из сложного ввода следующим образом:

Swift 3.1:

let test = "javascript:getInfo(1,'Info/99/something', 'City Hall',1, 99);"

if let match = test.range(of: "(?<=')[^']+", options: .regularExpression) {
    print(test.substring(with: match))
}

// Prints: Info/99/something

Swift 2.0:

let test = "javascript:getInfo(1,'Info/99/something', 'City Hall',1, 99);"

if let match = test.rangeOfString("(?<=')[^']+", options: .RegularExpressionSearch) {
    print(test.substringWithRange(match))
}

// Prints: Info/99/something
17
ответ дан seb 26 August 2018 в 04:07
поделиться

Swift 4 версия @litso. Чтобы найти все значения в тексте

    func find(inText text: String, pattern: String) -> [String]? {
        do {
            let regex = try NSRegularExpression(pattern: pattern, options: .caseInsensitive)
            let result = regex.matches(in: text, options: .init(rawValue: 0), range: NSRange(location: 0, length: text.count))

            let matches = result.map { result in
                return (text as NSString).substring(with: result.range)
            }

            return matches
        } catch {
            print(error)
        }
        return nil
    }
0
ответ дан Arek 26 August 2018 в 04:07
поделиться

Swift 4

extension String {

    func slice(from: String, to: String) -> String? {

        return (range(of: from)?.upperBound).flatMap { substringFrom in
            (range(of: to, range: substringFrom..<endIndex)?.lowerBound).map { substringTo in
                String(self[substringFrom..<substringTo])
            }
        }
    }
}

Swift 3

extension String {

    func slice(from: String, to: String) -> String? {

        return (range(of: from)?.upperBound).flatMap { substringFrom in
            (range(of: to, range: substringFrom..<endIndex)?.lowerBound).map { substringTo in
                substring(with: substringFrom..<substringTo)
            }
        }
    }
}

Старый ответ:

import Foundation

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

"javascript:getInfo(1,'Info/99/something', 'City Hall',1, 99);"
  .sliceFrom("'", to: "',")
61
ответ дан damirstuhec 26 August 2018 в 04:07
поделиться

Вы можете использовать var arr = str.componentsSeparatedByString(",") как ваш второй раскол, который вернет вам массив

3
ответ дан iAnurag 26 August 2018 в 04:07
поделиться

Рассмотрим использование регулярного выражения для соответствия всем одинарным кавычкам.

let string = "javascript:getInfo(1,'Info/99/something', 'City Hall',1, 99);"

let pattern = "'(.+?)'"
let regex = NSRegularExpression(pattern: pattern, options: nil, error: nil)
let results = regex!.matchesInString(string, options: nil, range: NSMakeRange(0, count(string)))  as! [NSTextCheckingResult]

let nsstring = string as NSString
let matches = results.map { result in return nsstring.substringWithRange(result.range)}

// First match
println(matches[0])
3
ответ дан litso 26 August 2018 в 04:07
поделиться

Это работает, если он всегда является вторым разделом:

let subString = split(string, isSeparator: "'")[1]
4
ответ дан Qbyte 26 August 2018 в 04:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: