সুইফট: চরিত্রের শেষ সূচক থেকে শুরু থেকে সাবস্ট্রিং কীভাবে পাবেন


110

আমি স্ট্রিংটিকে অন্য স্ট্রিংয়ে পরিণত করার সবচেয়ে ভাল / সহজ উপায়টি শিখতে চাই তবে কেবল একটি উপসেট দিয়ে শুরুতে শুরু করে কোনও চরিত্রের শেষ সূচীতে যেতে চাই।

উদাহরণস্বরূপ, "www.stackoverflow.com" কে "www.stackoverflow" তে রূপান্তর করুন। কোন কোড স্নিপেটটি এটি করবে এবং সর্বাধিক দ্রুতগতির মতো হবে? (আমি আশা করি এটি কোনও বিতর্ক এনেছে না, তবে কীভাবে সুইফটে সাবস্ট্রিংগুলি পরিচালনা করতে হবে সে সম্পর্কে ভাল পাঠ আমি খুঁজে পাই না।

উত্তর:


202

সবে পিছনে অ্যাক্সেস করা

সম্পত্তি এবং বিশ্বব্যাপী ফাংশনটির সাথে substringToIndexসম্মিলিতভাবে ব্যবহার করা সবচেয়ে ভাল উপায় wayendIndexadvance

var string1 = "www.stackoverflow.com"

var index1 = advance(string1.endIndex, -4)

var substring1 = string1.substringToIndex(index1)

পিছন থেকে শুরু করে একটি স্ট্রিং খুঁজছেন

ব্যবহার করুন rangeOfStringএবং সেট optionsকরুন.BackwardsSearch

var string2 = "www.stackoverflow.com"

var index2 = string2.rangeOfString(".", options: .BackwardsSearch)?.startIndex

var substring2 = string2.substringToIndex(index2!)

কোনও এক্সটেনশান নেই, খাঁটি ইডিয়োম্যাটিক সুইফট

সুইফট ২.০

advanceএখন একটি অংশ Indexএবং বলা হয় advancedBy। আপনি এটি পছন্দ করুন:

var string1 = "www.stackoverflow.com"

var index1 = string1.endIndex.advancedBy(-4)

var substring1 = string1.substringToIndex(index1)

সুইফট 3.0

আপনি কল করতে পারবেন না advancedByএকটি Stringকারণ এটি পরিবর্তনশীল আকার উপাদানগুলি নেই। আপনি ব্যবহার করতে হবে index(_, offsetBy:)

var string1 = "www.stackoverflow.com"

var index1 = string1.index(string1.endIndex, offsetBy: -4)

var substring1 = string1.substring(to: index1)

অনেক কিছুর নাম বদলে দেওয়া হয়েছে। মামলাগুলি উট কেসে লিখিত আছে, startIndexহয়ে গেছে lowerBound

var string2 = "www.stackoverflow.com"

var index2 = string2.range(of: ".", options: .backwards)?.lowerBound

var substring2 = string2.substring(to: index2!)

এছাড়াও, আমি জোর করে মোড়কানোর পরামর্শ দেব না index2। আপনি alচ্ছিক বাঁধাই বা ব্যবহার করতে পারেন map। ব্যক্তিগতভাবে, আমি ব্যবহার করতে পছন্দ করি map:

var substring3 = index2.map(string2.substring(to:))

সুইফট 4

সুইফট 3 সংস্করণটি এখনও বৈধ তবে এখন আপনি সূচী রেঞ্জ সহ সাবস্ক্রিপ্টগুলি ব্যবহার করতে পারেন:

let string1 = "www.stackoverflow.com"

let index1 = string1.index(string1.endIndex, offsetBy: -4)

let substring1 = string1[..<index1]

দ্বিতীয় পদ্ধতিটি অপরিবর্তিত রয়েছে:

let string2 = "www.stackoverflow.com"

let index2 = string2.range(of: ".", options: .backwards)?.lowerBound

let substring3 = index2.map(string2.substring(to:))

1
ধন্যবাদ @ fpg1503। এটি আমি এই ধরণের উত্তর খুঁজতে চাইছিলাম। অন্যান্য উত্তরগুলি আমাকে শিখিয়েছিল বা ভাষার বৈশিষ্ট্যগুলি স্মরণ করিয়ে দিয়েছিল, তবে এইভাবে আমি আমার সমস্যা সমাধানের জন্য ব্যবহার করব।
জেসন হকার

1
সুইফট ২.০ ব্যবহার করে string1.endIndex.advancedBy(-4)আমার পরিবর্তে কাজ করছেadvance
অ্যালেক্স কোশি

92
এটিকে সহজভাবে করার কোনও গুরুতর উপায় নেই?
devios1

12
@ দেভিওস সব সত্য। আমি উদ্দেশ্য-সি এর তুলনায় সুইফ্টের জন্য কৃতজ্ঞ, তবে আইএমএইচও এই উদ্বেগজনক কোডটি ঘটিয়েছে এমন উদ্বেগগুলি 99% কোড এবং কোডারের জন্য অপ্রাসঙ্গিক। সবচেয়ে খারাপ, আমরা নিজেরাই বাজে সুবিধার এক্সটেনশানগুলি লিখব। যদি নিয়মিত বিকাশকারীরা এই উচ্চ-স্তরের উদ্বেগগুলি বুঝতে না পারেন তবে আমরা যে সফটওয়্যারটি তৈরি করি তার সাথে পথচারীদের উদ্বেগ মোকাবেলায় তারা কমপক্ষে একটি অ্যাড-হক এপিআই লিখতে সক্ষম। রূপান্তর করার প্রবণতা NSStringস্পষ্টতই খারাপ, কারণ অবশেষে আমরা সকলেই ফাউন্ডেশন (উত্তরাধিকার) শ্রেণি থেকে দূরে যেতে চাই। তাই .... আরও রেটিং!
ড্যান রোজনস্টার্ক

2
সুইফ্ট 4 এ, আপনি করতে পারেন string1[..<index1]। দরকার নেই string1.startIndex
bauerMusic

26

সুইফট 3, এক্সকোড 8

func lastIndexOfCharacter(_ c: Character) -> Int? {
    return range(of: String(c), options: .backwards)?.lowerBound.encodedOffset
}

যেহেতু advancedBy(Int)সুইফট 3 ব্যবহার যেহেতু চলে গেছে String'র পদ্ধতি index(String.Index, Int)Stringসাবস্ট্রিং এবং বন্ধুদের সাথে এই এক্সটেনশনটি দেখুন :

public 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.substring(from: leftRange.upperBound)
        let closestToLeftRange = sub.range(of: right)!
        return sub.substring(to: closestToLeftRange.lowerBound)
    }

    var length: Int {
        get {
            return self.characters.count
        }
    }

    func substring(to : Int) -> String {
        let toIndex = self.index(self.startIndex, offsetBy: to)
        return self.substring(to: toIndex)
    }

    func substring(from : Int) -> String {
        let fromIndex = self.index(self.startIndex, offsetBy: from)
        return self.substring(from: fromIndex)
    }

    func substring(_ r: Range<Int>) -> String {
        let fromIndex = self.index(self.startIndex, offsetBy: r.lowerBound)
        let toIndex = self.index(self.startIndex, offsetBy: r.upperBound)
        return self.substring(with: Range<String.Index>(uncheckedBounds: (lower: fromIndex, upper: toIndex)))
    }

    func character(_ at: Int) -> Character {
        return self[self.index(self.startIndex, offsetBy: at)]
    }

    func lastIndexOfCharacter(_ c: Character) -> Int? {
        guard let index = range(of: String(c), options: .backwards)?.lowerBound else
        { return nil }
        return distance(from: startIndex, to: index)
    }
}

সুইফট 4-এর জন্য আপডেটড এক্সটেনশন

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

    var length: Int {
        get {
            return self.count
        }
    }

    func substring(to : Int) -> String {
        let toIndex = self.index(self.startIndex, offsetBy: to)
        return String(self[...toIndex])
    }

    func substring(from : Int) -> String {
        let fromIndex = self.index(self.startIndex, offsetBy: from)
        return String(self[fromIndex...])
    }

    func substring(_ r: Range<Int>) -> String {
        let fromIndex = self.index(self.startIndex, offsetBy: r.lowerBound)
        let toIndex = self.index(self.startIndex, offsetBy: r.upperBound)
        let indexRange = Range<String.Index>(uncheckedBounds: (lower: fromIndex, upper: toIndex))
        return String(self[indexRange])
    }

    func character(_ at: Int) -> Character {
        return self[self.index(self.startIndex, offsetBy: at)]
    }

    func lastIndexOfCharacter(_ c: Character) -> Int? {
        guard let index = range(of: String(c), options: .backwards)?.lowerBound else
        { return nil }
        return distance(from: startIndex, to: index)
    }
}

ব্যবহার:

let text = "www.stackoverflow.com"
let at = text.character(3) // .
let range = text.substring(0..<3) // www
let from = text.substring(from: 4) // stackoverflow.com
let to = text.substring(to: 16) // www.stackoverflow
let between = text.between(".", ".") // stackoverflow
let substringToLastIndexOfChar = text.lastIndexOfCharacter(".") // 17

পিএস এটি সত্যিই অদ্ভুত যে বিকাশকারীরা প্লেইনের String.Indexপরিবর্তে ডিল করতে বাধ্য হয়েছিল Int। কেন আমরা অভ্যন্তরীণ Stringযান্ত্রিক প্রক্রিয়াগুলি নিয়ে মাথা ঘামাই এবং কেন কেবল সহজ substring()পদ্ধতি না থাকি ?


আপনি ব্যবহার করা উচিত নয় encodedOffsetএই মন্তব্যটি এবং সঠিক পথ চেক করুন যে সম্পন্ন করার জন্য stackoverflow.com/questions/34540185/...
লিও Dabus

18

আমি এটি একটি সাবস্ক্রিপ্ট ( s[start..<end]) ব্যবহার করে করব :

সুইফট 3, 4, 5

let s = "www.stackoverflow.com"
let start = s.startIndex
let end = s.index(s.endIndex, offsetBy: -4)
let substring = s[start..<end] // www.stackoverflow

11

সম্পাদনা / আপডেট:

ইন সুইফট 4 বা পরে (Xcode 10.0+) আপনি নতুন ব্যবহার করতে পারেন BidirectionalCollection পদ্ধতি (এর lastIndex :)

func lastIndex(of element: Element) -> Int?

let string = "www.stackoverflow.com"
if let lastIndex = string.lastIndex(of: ".") {
    let subString = string[..<lastIndex]  // "www.stackoverflow"
}

এটি দুর্দান্ত উত্তর, তবে মনে হচ্ছে সুইফট 2 এর সাথে এই সম্পত্তিটি এনএসইউআরএল স্থানান্তরিত হয়েছে। হয়তো এটি ভবিষ্যতে লোকেরা এটি পড়তে সহায়তা করে ...
চুকি

8

আমি এখানে এটি কিভাবে। আপনি এটি একইভাবে করতে পারেন, বা ধারণাগুলির জন্য এই কোডটি ব্যবহার করতে পারেন।

let s = "www.stackoverflow.com"
s.substringWithRange(0..<s.lastIndexOf("."))

আমি যে এক্সটেনশনগুলি ব্যবহার করি তা এখানে:

import Foundation
extension String {

  var length: Int {
    get {
      return countElements(self)
    }
  }

  func indexOf(target: String) -> Int {
    var range = self.rangeOfString(target)
    if let range = range {
      return distance(self.startIndex, range.startIndex)
    } else {
      return -1
    }
  }

  func indexOf(target: String, startIndex: Int) -> Int {
    var startRange = advance(self.startIndex, startIndex)        
    var range = self.rangeOfString(target, options: NSStringCompareOptions.LiteralSearch, range: Range<String.Index>(start: startRange, end: self.endIndex))
    if let range = range {
      return distance(self.startIndex, range.startIndex)
    } else {
      return -1
    }
  }

  func lastIndexOf(target: String) -> Int {
    var index = -1
    var stepIndex = self.indexOf(target)
    while stepIndex > -1 {
      index = stepIndex
      if stepIndex + target.length < self.length {
        stepIndex = indexOf(target, startIndex: stepIndex + target.length)
      } else {
        stepIndex = -1
      }
    }
    return index
  } 

  func substringWithRange(range:Range<Int>) -> String {
    let start = advance(self.startIndex, range.startIndex)
    let end = advance(self.startIndex, range.endIndex)
    return self.substringWithRange(start..<end)
  }

}

ক্রেডিট আলবার্টবোরি / কমন সুইফ্ট স্ট্রিং এক্সটেনশনগুলি

সাধারণত আমি স্ট্রিং ম্যানিপুলেশন, অনুসন্ধান এবং টুকরো টুকরো করার মতো প্রয়োজনের জন্য এক্সটেনশনের শক্তিশালী প্রবক্তা।


2
আমি মনে করি স্ট্রিং ইন সুইফ্টের এপিআই উন্নত করতে এগুলি অ্যাপলের কিছু করা উচিত।
skyline75489

2
এই এপিআই খুঁজছেন। অ্যাপল সুইফটে প্রচুর বেসিক এপিআইয়ের অভাব রয়েছে। এটি একটি খুব জটিল ভাষা এবং সম্পূর্ণও নয়। সুইফ্ট বুলশিট!
লোক

আপনি উল্লেখ করেছেন এমন গ্রন্থাগারের সুইফট 3 সংস্করণে একটি কাঁটাচামচ এবং আপডেট হয়েছে: github.com/iamjono/SwiftString
রেনিপেট

5

String বিল্টিন সাবস্ট্রিং বৈশিষ্ট্য রয়েছে:

extension String : Sliceable {
    subscript (subRange: Range<String.Index>) -> String { get }
}

আপনি যা চান তা যদি " কোনও চরিত্রের প্রথম সূচীতে যায়", আপনি বিল্টিন find()ফাংশনটি ব্যবহার করে সাবস্ট্রিং পেতে পারেন :

var str = "www.stackexchange.com"
str[str.startIndex ..< find(str, ".")!] // -> "www"

শেষ সূচকটি খুঁজতে , আমরা প্রয়োগ করতে পারি findLast()

/// Returns the last index where `value` appears in `domain` or `nil` if
/// `value` is not found.
///
/// Complexity: O(\ `countElements(domain)`\ )
func findLast<C: CollectionType where C.Generator.Element: Equatable>(domain: C, value: C.Generator.Element) -> C.Index? {
    var last:C.Index? = nil
    for i in domain.startIndex..<domain.endIndex {
        if domain[i] == value {
            last = i
        }
    }
    return last
}

let str = "www.stackexchange.com"
let substring = map(findLast(str, ".")) { str[str.startIndex ..< $0] } // as String?
// if "." is found, substring has some, otherwise `nil`

যোগ করেছেন:

হতে পারে, এর BidirectionalIndexTypeবিশেষায়িত সংস্করণটি findLastদ্রুত:

func findLast<C: CollectionType where C.Generator.Element: Equatable, C.Index: BidirectionalIndexType>(domain: C, value: C.Generator.Element) -> C.Index? {
    for i in lazy(domain.startIndex ..< domain.endIndex).reverse() {
        if domain[i] == value {
            return i
        }
    }
    return nil
}

স্ট্রিংয়ের সাবস্ক্রিপ্টটি সুইফট ২.০-তে উপলব্ধ বলে মনে হচ্ছে না, আপনি কি কোনও প্রতিস্থাপন জানেন?
কোরি

আপনি কি জানেন কীভাবে আমি সুইফট 4 বা তারপরে বিডাইরেকশনাল ইন্ডেক্স টাইপের সূচকে সীমাবদ্ধ রাখতে পারি?
লিও ডাবাস

5

আপনি এই এক্সটেনশনগুলি ব্যবহার করতে পারেন:

সুইফট 2.3

 extension String
    {
        func substringFromIndex(index: Int) -> String
        {
            if (index < 0 || index > self.characters.count)
            {
                print("index \(index) out of bounds")
                return ""
            }
            return self.substringFromIndex(self.startIndex.advancedBy(index))
        }

        func substringToIndex(index: Int) -> String
        {
            if (index < 0 || index > self.characters.count)
            {
                print("index \(index) out of bounds")
                return ""
            }
            return self.substringToIndex(self.startIndex.advancedBy(index))
        }

        func substringWithRange(start: Int, end: Int) -> String
        {
            if (start < 0 || start > self.characters.count)
            {
                print("start index \(start) out of bounds")
                return ""
            }
            else if end < 0 || end > self.characters.count
            {
                print("end index \(end) out of bounds")
                return ""
            }
            let range = Range(start: self.startIndex.advancedBy(start), end: self.startIndex.advancedBy(end))
            return self.substringWithRange(range)
        }

        func substringWithRange(start: Int, location: Int) -> String
        {
            if (start < 0 || start > self.characters.count)
            {
                print("start index \(start) out of bounds")
                return ""
            }
            else if location < 0 || start + location > self.characters.count
            {
                print("end index \(start + location) out of bounds")
                return ""
            }
            let range = Range(start: self.startIndex.advancedBy(start), end: self.startIndex.advancedBy(start + location))
            return self.substringWithRange(range)
        }
    }

সুইফট 3

extension String
{   
    func substring(from index: Int) -> String
    {
        if (index < 0 || index > self.characters.count)
        {
            print("index \(index) out of bounds")
            return ""
        }
        return self.substring(from: self.characters.index(self.startIndex, offsetBy: index))
    }

    func substring(to index: Int) -> String
    {
        if (index < 0 || index > self.characters.count)
        {
            print("index \(index) out of bounds")
            return ""
        }
        return self.substring(to: self.characters.index(self.startIndex, offsetBy: index))
    }

    func substring(start: Int, end: Int) -> String
    {
        if (start < 0 || start > self.characters.count)
        {
            print("start index \(start) out of bounds")
            return ""
        }
        else if end < 0 || end > self.characters.count
        {
            print("end index \(end) out of bounds")
            return ""
        }
        let startIndex = self.characters.index(self.startIndex, offsetBy: start)
        let endIndex = self.characters.index(self.startIndex, offsetBy: end)
        let range = startIndex..<endIndex

        return self.substring(with: range)
    }

    func substring(start: Int, location: Int) -> String
    {
        if (start < 0 || start > self.characters.count)
        {
            print("start index \(start) out of bounds")
            return ""
        }
        else if location < 0 || start + location > self.characters.count
        {
            print("end index \(start + location) out of bounds")
            return ""
        }
        let startIndex = self.characters.index(self.startIndex, offsetBy: start)
        let endIndex = self.characters.index(self.startIndex, offsetBy: start + location)
        let range = startIndex..<endIndex

        return self.substring(with: range)
    }
}

ব্যবহার:

let string = "www.stackoverflow.com"        
let substring = string.substringToIndex(string.characters.count-4)

5

সুইফট 4:

extension String {

    /// the length of the string
    var length: Int {
        return self.characters.count
    }

    /// Get substring, e.g. "ABCDE".substring(index: 2, length: 3) -> "CDE"
    ///
    /// - parameter index:  the start index
    /// - parameter length: the length of the substring
    ///
    /// - returns: the substring
    public func substring(index: Int, length: Int) -> String {
        if self.length <= index {
            return ""
        }
        let leftIndex = self.index(self.startIndex, offsetBy: index)
        if self.length <= index + length {
            return self.substring(from: leftIndex)
        }
        let rightIndex = self.index(self.endIndex, offsetBy: -(self.length - index - length))
        return self.substring(with: leftIndex..<rightIndex)
    }

    /// Get substring, e.g. -> "ABCDE".substring(left: 0, right: 2) -> "ABC"
    ///
    /// - parameter left:  the start index
    /// - parameter right: the end index
    ///
    /// - returns: the substring
    public func substring(left: Int, right: Int) -> String {
        if length <= left {
            return ""
        }
        let leftIndex = self.index(self.startIndex, offsetBy: left)
        if length <= right {
            return self.substring(from: leftIndex)
        }
        else {
            let rightIndex = self.index(self.endIndex, offsetBy: -self.length + right + 1)
            return self.substring(with: leftIndex..<rightIndex)
        }
    }
}

আপনি নিম্নলিখিত হিসাবে এটি পরীক্ষা করতে পারেন:

    print("test: " + String("ABCDE".substring(index: 2, length: 3) == "CDE"))
    print("test: " + String("ABCDE".substring(index: 0, length: 3) == "ABC"))
    print("test: " + String("ABCDE".substring(index: 2, length: 1000) == "CDE"))
    print("test: " + String("ABCDE".substring(left: 0, right: 2) == "ABC"))
    print("test: " + String("ABCDE".substring(left: 1, right: 3) == "BCD"))
    print("test: " + String("ABCDE".substring(left: 3, right: 1000) == "DE"))

Https://gitlab.com/seriyvolk83/SwiftEx লাইব্রেরি পরীক্ষা করুন । এটিতে এই এবং অন্যান্য সহায়ক পদ্ধতি রয়েছে।


4

আপনি কি এর কোনও অক্ষরের একটি সূচনার সূচনা থেকে শেষ সূচী পর্যন্ত স্ট্রিংয়ের স্ট্রিং পেতে চান? যদি তা হয় তবে আপনি নীচের একটি সুইফট ২.০+ পদ্ধতি বেছে নিতে পারেন।

যে পদ্ধতিগুলি প্রয়োজন Foundation

একটি স্ট্রিং পান যা একটি অক্ষরের শেষ সূচক অন্তর্ভুক্ত করে:

import Foundation

let string = "www.stackoverflow.com"
if let rangeOfIndex = string.rangeOfCharacterFromSet(NSCharacterSet(charactersInString: "."), options: .BackwardsSearch) {
    print(string.substringToIndex(rangeOfIndex.endIndex))
}

// prints "www.stackoverflow."

এমন একটি স্ট্রিং পান যা কোনও অক্ষরের শেষ সূচি অন্তর্ভুক্ত করে না:

import Foundation

let string = "www.stackoverflow.com"
if let rangeOfIndex = string.rangeOfCharacterFromSet(NSCharacterSet(charactersInString: "."), options: .BackwardsSearch) {
    print(string.substringToIndex(rangeOfIndex.startIndex))
}

// prints "www.stackoverflow"

আপনার যদি সেই ক্রিয়াকলাপগুলির পুনরাবৃত্তি প্রয়োজন হয় তবে প্রসারিত Stringকরা ভাল সমাধান হতে পারে:

import Foundation

extension String {
    func substringWithLastInstanceOf(character: Character) -> String? {
        if let rangeOfIndex = rangeOfCharacterFromSet(NSCharacterSet(charactersInString: String(character)), options: .BackwardsSearch) {
            return self.substringToIndex(rangeOfIndex.endIndex)
        }
        return nil
    }
    func substringWithoutLastInstanceOf(character: Character) -> String? {
        if let rangeOfIndex = rangeOfCharacterFromSet(NSCharacterSet(charactersInString: String(character)), options: .BackwardsSearch) {
            return self.substringToIndex(rangeOfIndex.startIndex)
        }
        return nil
    }
}

print("www.stackoverflow.com".substringWithLastInstanceOf("."))
print("www.stackoverflow.com".substringWithoutLastInstanceOf("."))

/*
prints:
Optional("www.stackoverflow.")
Optional("www.stackoverflow")
*/

যে পদ্ধতিগুলির প্রয়োজন নেই Foundation

একটি স্ট্রিং পান যা একটি অক্ষরের শেষ সূচক অন্তর্ভুক্ত করে:

let string = "www.stackoverflow.com"
if let reverseIndex = string.characters.reverse().indexOf(".") {
    print(string[string.startIndex ..< reverseIndex.base])
}

// prints "www.stackoverflow."

এমন একটি স্ট্রিং পান যা কোনও অক্ষরের শেষ সূচি অন্তর্ভুক্ত করে না:

let string = "www.stackoverflow.com"
if let reverseIndex = string.characters.reverse().indexOf(".") {
    print(string[string.startIndex ..< reverseIndex.base.advancedBy(-1)])
}

// prints "www.stackoverflow"

আপনার যদি সেই ক্রিয়াকলাপগুলির পুনরাবৃত্তি প্রয়োজন হয় তবে প্রসারিত Stringকরা ভাল সমাধান হতে পারে:

extension String {
    func substringWithLastInstanceOf(character: Character) -> String? {
        if let reverseIndex = characters.reverse().indexOf(".") {
            return self[self.startIndex ..< reverseIndex.base]
        }
        return nil
    }
    func substringWithoutLastInstanceOf(character: Character) -> String? {
        if let reverseIndex = characters.reverse().indexOf(".") {
            return self[self.startIndex ..< reverseIndex.base.advancedBy(-1)]
        }
        return nil
    }
}

print("www.stackoverflow.com".substringWithLastInstanceOf("."))
print("www.stackoverflow.com".substringWithoutLastInstanceOf("."))

/*
prints:
Optional("www.stackoverflow.")
Optional("www.stackoverflow")
*/

4

আপনি যদি সূচকটি জানেন তবে সাবস্ট্রিংয়ের একটি সহজ এবং স্বল্প উপায়:

let s = "www.stackoverflow.com"
let result = String(s.characters.prefix(17)) // "www.stackoverflow"

আপনার সূচকটি স্ট্রিংয়ের দৈর্ঘ্য অতিক্রম করলে এটি অ্যাপটিকে ক্রাশ করবে না:

let s = "short"
let result = String(s.characters.prefix(17)) // "short"

উভয় উদাহরণ সুইফট 3 প্রস্তুত


4

একটি জিনিস যা তালি যোগ করে তা হ'ল পুনরাবৃত্তি stringVar:

স্ট্রিংওয়ার [ স্ট্রিংওয়ার .আইডেক্স ( স্ট্রিংভার। স্টার্টইন্ডেক্স, অফসেটবি: ...)

ইন সুইফট 4

একটি এক্সটেনশন এর কিছু হ্রাস করতে পারে:

extension String {

    func index(at: Int) -> String.Index {
        return self.index(self.startIndex, offsetBy: at)
    }
}

তারপরে, ব্যবহার:

let string = "abcde"

let to = string[..<string.index(at: 3)] // abc
let from = string[string.index(at: 3)...] // de

এটি লক্ষ করা উচিত toএবং fromএটি টাইপ Substring(বা String.SubSequance)। তারা নতুন স্ট্রিং বরাদ্দ করে না এবং প্রক্রিয়াকরণের জন্য আরও দক্ষ।

কোনও Stringপ্রকার ফিরে পেতে, এখানে আবার Substringকাস্ট করা প্রয়োজন String:

let backToString = String(from)

এখানেই শেষ পর্যন্ত একটি স্ট্রিং বরাদ্দ করা হয়।


3
func substr(myString: String, start: Int, clen: Int)->String

{
  var index2 = string1.startIndex.advancedBy(start)
  var substring2 = string1.substringFromIndex(index2)
  var index1 = substring2.startIndex.advancedBy(clen)
  var substring1 = substring2.substringToIndex(index1)

  return substring1   
}

substr(string1, start: 3, clen: 5)

3

সুইফট 3

let string = "www.stackoverflow.com"
let first3Characters = String(string.characters.prefix(3)) // www
let lastCharacters = string.characters.dropFirst(4) // stackoverflow.com (it would be a collection)

//or by index 
let indexOfFouthCharacter = olNumber.index(olNumber.startIndex, offsetBy: 4)
let first3Characters = olNumber.substring(to: indexOfFouthCharacter) // www
let lastCharacters = olNumber.substring(from: indexOfFouthCharacter) // .stackoverflow.com

বোঝার জন্য ভাল নিবন্ধ , কেন আমাদের এটি প্রয়োজন


2

আমি দুটি স্ট্রিং পদ্ধতি সহ স্ট্রিং প্রসারিত করেছি। আপনি / থেকে ব্যাপ্তি বা এর থেকে / দৈর্ঘ্যের মতো স্ট্রিংগুলিকে কল করতে পারেন:

var bcd = "abcdef".substring(1,to:3)
var cde = "abcdef".substring(2,to:-2)
var cde = "abcdef".substring(2,length:3)

extension String {
  public func substring(from:Int = 0, var to:Int = -1) -> String {
    if to < 0 {
        to = self.length + to
    }
    return self.substringWithRange(Range<String.Index>(
        start:self.startIndex.advancedBy(from),
        end:self.startIndex.advancedBy(to+1)))
  }
  public func substring(from:Int = 0, length:Int) -> String {
    return self.substringWithRange(Range<String.Index>(
        start:self.startIndex.advancedBy(from),
        end:self.startIndex.advancedBy(from+length)))
  }
}

self.leth আর পাওয়া যায় না। আপনি এক্সটেনশন দিয়ে এই অ্যাড করতে হবে (Andrewz, কোড আপডেট করে নিন; আমি অন্য উত্তর পোস্ট করতে চান না): পাবলিক func দৈর্ঘ্য () -> ইন্টারঅ্যাক্টিভ {ফিরতি self.lengthOfBytesUsingEncoding (NSUTF16StringEncoding)}
ফিলিপ

1

সুইফট ২.০ নীচের কোডটি এক্সকোড .2.২ এ পরীক্ষা করা হয়েছে। নীচে সংযুক্ত স্ক্রিনশট দেখুন

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        var mainText = "http://stackoverflow.com"

        var range = Range(start: mainText.startIndex.advancedBy(7), end: mainText.startIndex.advancedBy(24))
        var subText = mainText.substringWithRange(range)


        //OR Else use below for LAST INDEX

        range = Range(start: mainText.startIndex.advancedBy(7), end: mainText.endIndex)
        subText = mainText.substringWithRange(range)
    }
}

1

সুইফ্ট 5 এ

String.Indexসূচকে উপস্থাপন করার জন্য আমাদের সাধারণ ইনট মানের পরিবর্তে প্রয়োজন ।

এছাড়াও মনে রাখবেন, আমরা যখন সুইফট String(মান ধরণ) থেকে সাবস্ট্রিং নেওয়ার চেষ্টা করি তখন আমাদের প্রকৃতপক্ষে Sequenceপ্রোটোকল দিয়ে পুনরাবৃত্তি করতে হয়, যা String.SubSequenceপ্রকারের পরিবর্তে Stringটাইপ দেয়।

ফিরে যেতে Stringথেকে String.SubSequence, ব্যবহারString(subString)

নীচে হিসাবে উদাহরণ:

    let string = "https://stackoverflow.com"
    let firstIndex = String.Index(utf16Offset: 0, in: string)
    let lastIndex = String.Index(utf16Offset: 6, in: string)
    let subString = String(string[firstIndex...lastIndex])

0

সুইফট ২.০ এর জন্য এটি এর মতো:

var string1 = "www.stackoverflow.com"
var index1 = string1.endIndex.advancedBy(-4)
var substring1 = string1.substringToIndex(index1)

হতে পারে তারা এটি পরিবর্তন করেছে, তবে এটি 'অ্যাডভান্সড বাই' ('অ্যাডভান্সড' এর শেষে 'ডি' নোট করুন)
ওয়েজ মার্টিন

0

আমি অ্যান্ড্রুজের পোস্টটিকে সুইফট ২.০ (এবং সম্ভবত সুইফট ৩.০) এর সাথে সামঞ্জস্য করার জন্য পরিবর্তন করেছি। আমার বিনীত মতে, এই এক্সটেনশনটি বোঝা সহজ এবং অন্যান্য ভাষায় (যেমন পিএইচপি) উপলভ্য রয়েছে তার সাথে সমান

extension String {

    func length() -> Int {
        return self.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)
    }
    func substring(from:Int = 0, to:Int = -1) -> String {
       var nto=to
        if nto < 0 {
            nto = self.length() + nto
        }
        return self.substringWithRange(Range<String.Index>(
           start:self.startIndex.advancedBy(from),
           end:self.startIndex.advancedBy(nto+1)))
    }
    func substring(from:Int = 0, length:Int) -> String {
        return self.substringWithRange(Range<String.Index>(
            start:self.startIndex.advancedBy(from),
            end:self.startIndex.advancedBy(from+length)))
    }
}

0

আমি সুইফট 4 এর জন্য একটি সাধারণ স্ট্রিং-এক্সটেনশনও তৈরি করি:

extension String {
    func subStr(s: Int, l: Int) -> String { //s=start, l=lenth
        let r = Range(NSRange(location: s, length: l))!
        let fromIndex = self.index(self.startIndex, offsetBy: r.lowerBound)
        let toIndex = self.index(self.startIndex, offsetBy: r.upperBound)
        let indexRange = Range<String.Index>(uncheckedBounds: (lower: fromIndex, upper: toIndex))

        return String(self[indexRange])
     }
}

সুতরাং আপনি সহজেই এটিকে কল করতে পারেন:

"Hallo world".subStr(s: 1, l: 3) //prints --> "all"

0

এই Int-basedকাজের চেষ্টা করুন :

extension String {
    // start and end is included
    func intBasedSubstring(_ start: Int, _ end: Int) -> String {
        let endOffset: Int = -(count - end - 1)
        let startIdx = self.index(startIndex, offsetBy: start)
        let endIdx = self.index(endIndex, offsetBy: endOffset)
        return String(self[startIdx..<endIdx])
    }
}

দ্রষ্টব্য: এটি কেবল একটি অনুশীলন। এটি সীমানা পরীক্ষা করে না। আপনার প্রয়োজন অনুসারে পরিবর্তন করুন।


-1

সুইফটে সাবস্ট্রিংয়ের জন্য এখানে একটি সহজ উপায়

import UIKit

var str = "Hello, playground" 
var res = NSString(string: str)
print(res.substring(from: 4))
print(res.substring(to: 10))

ওপি জিজ্ঞাসা করে "কীভাবে অক্ষরটির শেষ সূচক থেকে শুরু থেকে সাবস্ট্রিং পাবেন" পূর্বনির্ধারিত হার্ডকোডযুক্ত মানগুলি ব্যবহার করে কীভাবে সাবস্ট্রিং পাবেন না।
এরিক আয়া

এটি আসল উদাহরণ: "www.stackoverflow.com" "" www.stackoverflow "তে রূপান্তর করুন। আপনি যদি শুরু থেকে শেষ পর্যন্ত একটি স্ট্রিংিং চান তবে এর কিছু করার দরকার নেই অর্থাৎ ফলাফলটি ইনপুট স্ট্রিং হিসাবে রয়েছে। উপরের উত্তরের দরকারীতা পুনরুদ্ধার করুন।
ZagorTeNej
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.