스위프트 : 캐릭터의 시작부터 마지막 인덱스까지 하위 문자열을 얻는 방법
문자열을 다른 문자열로 변환하는 가장 좋은/단순한 방법을 배우고 싶습니다. 처음부터 시작하여 문자의 마지막 색인까지 부분 집합만 사용합니다.
예를 들어 "www.stackoverflow.com "을 "www.stackoverflow"로 변환합니다.어떤 코드 조각이 그렇게 할 수 있을까요? 그리고 가장 신속하게?(저는 이것이 논쟁을 일으키지 않기를 바라지만 스위프트에서 서브스트링을 다루는 방법에 대한 좋은 교훈을 찾을 수 없습니다.
역방향으로 액세스하는 것만으로
가장 좋은 방법은 사용하는 것입니다.substringToIndex
에 합쳐진endIndex
과 과.advance
전역 함수
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!)
내선 없음, 순전한 관용어 스위프트.
스위프트 2.0
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
. 선택적 바인딩을 사용할 수 있습니다.map
. 개인적으로, 저는 사용하는 것을 선호합니다.map
:
var substring3 = index2.map(string2.substring(to:))
스위프트 4
Swift 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:))
스위프트 3, X코드 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)
}
}
Swift 5에 대한 업데이트된 확장 기능
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
P.S. 개발자들이 그들을 상대하도록 강요한 것은 정말 이상한 일입니다.String.Index
평범하지 않고Int
. 왜 우리가 내부적인 문제에 신경써야 합니까?String
단순한 것만이 아닌 역학substring()
메소드?
구독자를 사용하여 수행합니다(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
편집/업데이트:
Swift 4 이상(Xcode 10.0+)에서는 새로운 Bidirectional Collection 메서드 lastIndex(오브:)를 사용할 수 있습니다.
func lastIndex(of element: Self.Element) -> Self.Index?
let string = "www.stackoverflow.com"
if let lastIndex = string.lastIndex(of: ".") {
let subString = string[..<lastIndex] // "www.stackoverflow"
}
이렇게 하죠.당신은 같은 방법으로 할 수도 있고, 아이디어를 얻기 위해 이 코드를 사용할 수도 있습니다.
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)
}
}
일반적으로 저는 특히 문자열 조작, 검색 및 슬라이싱과 같은 요구에 대해 확장을 강력하게 지지합니다.
한 가지 더 달갑게 하는 것은 반복되는 것입니다.stringVar
:
stringVar[stringVar.index(stringVar.startIndex, offsetBy: ...)
인 스위프트 4
확장을 사용하면 다음 중 일부를 줄일 수 있습니다.
extension String {
func index(at location: Int) -> String.Index {
return self.index(self.startIndex, offsetBy: location)
}
}
그런 다음 용도:
let string = "abcde"
let to = string[..<string.index(at: 3)] // abc
let from = string[string.index(at: 3)...] // de
주의해야 할 점은to
그리고.from
활자다Substring
(또는String.SubSequance
). 새로운 문자열을 할당하지 않고 처리에 더 효율적입니다.
돌려받으려면 aString
유형,Substring
에 다시 던져질 필요가 있습니다.String
:
let backToString = String(from)
여기에 최종적으로 문자열이 할당됩니다.
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
}
다음 확장을 사용할 수 있습니다.
스위프트 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)
스위프트 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 라이브러리를 확인합니다.여기에는 이러한 방법과 다른 유용한 방법들이 포함되어 있습니다.
문자열의 하위 문자열을 시작 인덱스에서 문자 중 하나의 마지막 인덱스로 가져오시겠습니까?그렇다면 다음 Swift 2.0+ 방법 중 하나를 선택할 수 있습니다.
필요한 메소드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")
*/
지수를 알고 있다면 부분 문자열을 얻는 쉽고 짧은 방법은 다음과 같습니다.
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"
두 예 모두 Swift 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
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
이해하기 좋은 기사, 왜 이런 것이 필요한가요?
저는 두 가지 서브스트링 방식으로 String을 확장했습니다.다음과 같이 from/to/range 또는 from/length로 하위 문자열을 호출할 수 있습니다.
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)))
}
}
인 스위프트 5
우리는 필요합니다.String.Index
인덱스를 나타낼 단순한 Int 값 대신.
스위프트에서 subString을 받으려 할 때 기억하세요.String
(value type), 우리는 실제로 다음과 같이 반복해야 합니다.Sequence
protocol, 이것은 반환됩니다.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])
스위프트 2.0 아래 코드는 XCode 7.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)
}
}
스위프트 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"
이거 먹어봐요.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])
}
}
참고: 그냥 연습일 뿐입니다.그것은 경계를 확인하지 않습니다.필요에 맞게 수정합니다.
var myString = "abcde"
var subString = myString[2,4] // The result will be "cde"
extension String {
subscript(startIndex: Int, endIndex: Int) -> String {
let start = self.index(self.startIndex, offsetBy: startIndex)
let end = self.index(self.startIndex, offsetBy: endIndex)
let range = start...end
return String(self[range])
}
}
스위프트 2.0의 경우 다음과 같습니다.
var string1 = "www.stackoverflow.com"
var index1 = string1.endIndex.advancedBy(-4)
var substring1 = string1.substringToIndex(index1)
나는 앤드류즈의 게시물을 스위프트 2.0(그리고 아마도 스위프트 3.0)과 호환되도록 수정했습니다.이 확장자는 다른 언어(PHP 등)에서 사용할 수 있는 것과 유사하고 이해하기 쉽다고 생각합니다.
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)))
}
}
var url = "www.stackoverflow.com"
let str = path.suffix(3)
print(str) //low
스위프트에서 서브스트링을 얻는 간단한 방법이 있습니다.
import UIKit
var str = "Hello, playground"
var res = NSString(string: str)
print(res.substring(from: 4))
print(res.substring(to: 10))
언급URL : https://stackoverflow.com/questions/28182441/swift-how-to-get-substring-from-start-to-last-index-of-character
'programing' 카테고리의 다른 글
TextView BOLD에서 특정 텍스트를 만드는 방법 (0) | 2023.10.22 |
---|---|
목표-C에서 스위프트 스트링 열거를 사용할 수 있도록 하는 방법? (0) | 2023.10.22 |
MYSQL - 각 테이블의 행 개수 수 (0) | 2023.10.22 |
판다의 다중 인덱스 정렬 (0) | 2023.10.22 |
compound 'if' 조건을 쓰는 더 짧은 방법이 있습니까? (0) | 2023.10.17 |