ios Swift在字符串中的2个字符串之间获取字符串

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/31725424/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 07:03:23  来源:igfitidea点击:

Swift Get string between 2 strings in a string

iosstringswiftsubstring

提问by alp

I am getting a string from html parse that is;

我从 html 解析中得到一个字符串;

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

my code is something like

我的代码是这样的

var startIndex = text.rangeOfString("'")
var endIndex = text.rangeOfString("',")
var range2 = startIndex2...endIndex
substr= string.substringWithRange(range)

i am not sure if my second splitting string should be "'" or "',"

我不确定我的第二个拆分字符串应该是“'”还是“',”

i want my outcome as

我希望我的结果是

substr = "Info/99/something"

采纳答案by seb

I'd use a regular expression to extract substrings from complex input like this.

我会使用正则表达式从这样的复杂输入中提取子字符串。

Swift 3.1:

斯威夫特 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:

斯威夫特 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

回答by oisdk

Swift 4, 4.2, 5

斯威夫特 4、4.2、5

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

斯威夫特 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)
            }
        }
    }
}


Old answer:

旧答案:

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: "',")

回答by Qbyte

This works if it is always the second split:

如果它始终是第二个拆分,则此方法有效:

let subString = split(string, isSeparator: "'")[1]

回答by iAnurag

You can use var arr = str.componentsSeparatedByString(",")as your second split which will return you array

您可以使用var arr = str.componentsSeparatedByString(",")作为您的第二个拆分,这将返回您的数组

回答by pkamb

I rewrote one of the top Swift 4 answers to understand what it was doing with map. I prefer a version using guard, IMO

我重写了最重要的 Swift 4 答案之一,以了解它对map. 我更喜欢使用guard, IMO的版本

Would be easy to add options for Backwards Search, etc.

为向后搜索等添加选项会很容易。

extension String {

    func slice(from: String, to: String) -> String? {
        guard let rangeFrom = range(of: from)?.upperBound else { return nil }
        guard let rangeTo = self[rangeFrom...].range(of: to)?.lowerBound else { return nil }
        return String(self[rangeFrom..<rangeTo])
    }

}

let test1 = "a[b]c".slice(from: "[", to: "]")   // "b"
let test2 = "abc".slice(from: "[", to: "]")     // nil
let test3 = "a]b[c".slice(from: "[", to: "]")   // nil
let test4 = "[a[b]c]".slice(from: "[", to: "]") // "a[b"

回答by litso

Consider using a regular expression to match everything between single quotes.

考虑使用正则表达式来匹配单引号之间的所有内容。

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

回答by Devansh Vyas

Swift 4.2:

斯威夫特 4.2:

extension String {

    //right is the first encountered string after left
    func between(_ left: String, _ right: String) -> String? {
        guard let leftRange = range(of: left), let rightRange = range(of: right, options: .backwards)
            ,leftRange.upperBound <= rightRange.lowerBound else { return nil }

        let sub = self[leftRange.upperBound...]
        let closestToLeftRange = sub.range(of: right)!
        return String(sub[..<closestToLeftRange.lowerBound])
    }

}

回答by Leo Dabus

In Swift 4 or later you can create an extension method on StringProtocol to support substrings as well. You can just return a Substringinstead of a new String:

在 Swift 4 或更高版本中,您可以在 StringProtocol 上创建扩展方法来支持子字符串。你可以只返回一个Substring而不是一个新的字符串:

edit/u[date: Swift 5

编辑/你[日期:Swift 5

extension StringProtocol  {
    func substring(from start: Self, to end: Self? = nil, options: String.CompareOptions = []) -> SubSequence? {
        guard let lower = range(of: start, options: options)?.upperBound else { return nil }
        guard let end = end else { return self[lower...] }
        guard let upper = self[lower...].range(of: end, options: options)?.lowerBound else { return nil }
        return self[lower..<upper]
    }
}


let string = "javascript:getInfo(1,'Info/99/something', 'City Hall',1, 99);"
let substr = string.substring(from: "'")                   // "Info/99/something', 'City Hall',1, 99);"
let subString = string.substring(from: "'", to: "',")  // "Info/99/something"

let subStringCaseInsensitive = string.substring(from: "'info/", to: "/something", options: .caseInsensitive)  // "99"

回答by Arek

Swift 4 version of @litso. To find all values in text

@litso 的 Swift 4 版本。查找文本中的所有值

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
}

回答by ScottyBlades

Swift 5

斯威夫特 5

extension String {

    ///Returns an empty string when there is no path.
    func substring(from left: String, to right: String) -> String {
        if let match = range(of: "(?<=\(left))[^\(right)]+", options: .regularExpression) {
            return String(self[match])
        }
        return ""
    }
}