2017-01-10 23 views
15

Mỗi ví dụ về cắt xén trong Swift loại bỏ cả khoảng trống đầu và đuôi, nhưng cách chỉ có dấu cách để xoá khoảng trắng?Chỉ cắt khoảng trắng sau từ cuối chuỗi trong Swift 3

Ví dụ, nếu tôi có một chuỗi:

" example " 

Làm thế nào tôi có thể kết thúc với:

" example" 

Mỗi giải pháp tôi đã tìm thấy chương trình trimmingCharacters(in: CharacterSet.whitespaces), nhưng tôi muốn giữ lại hàng đầu khoảng trống.

RegEx là một khả năng, hoặc một phạm vi có thể được bắt nguồn để xác định chỉ số của các ký tự để loại bỏ, nhưng tôi dường như không thể tìm thấy một giải pháp thanh lịch cho việc này.

+1

có thể trùng lặp của [Swift loại bỏ CHỈ dấu không gian từ chuỗi] (http://stackoverflow.com/questions/41412161/swift-remove-only-trailing-spaces-from-string) – Hamish

Trả lời

27

Với biểu thức thông thường:

let string = " example " 
let trimmed = string.replacingOccurrences(of: "\\s+$", with: "", options: .regularExpression) 
print(">" + trimmed + "<") 
// > example< 

\s+ phù hợp với một hoặc nhiều ký tự khoảng trắng, và $ trận cuối của chuỗi.

+0

Vâng, đó có thể là đẹp hơn.Tôi không nói nếu điều đó đi mà không nói, nhưng điều này cũng cần 'Foundation'. – Raphael

5

Trong Foundation bạn có thể nhận phạm vi chỉ mục phù hợp với cụm từ thông dụng. Bạn cũng có thể thay thế các trang con. Kết hợp này, chúng tôi nhận được:

import Foundation 
extension String { 
    func trimTrailingWhitespace() -> String { 
     if let trailingWs = self.range(of: "\\s+$", options: .regularExpression) { 
      return self.replacingCharacters(in: trailingWs, with: "") 
     } else { 
      return self 
     } 
    } 
} 

Bạn cũng có thể có một phiên bản đột biến của việc này:

import Foundation 
extension String { 
    mutating func trimTrailingWhitespace() { 
     if let trailingWs = self.range(of: "\\s+$", options: .regularExpression) { 
      self.replaceSubrange(trailingWs, with: "") 
     } 
    } 
} 

Nếu chúng ta phù hợp với \s* (như Martin R. đã làm lúc đầu), chúng tôi có thể bỏ qua if let bảo vệ và buộc tháo rời tùy chọn vì sẽ luôn có kết quả phù hợp. Tôi nghĩ rằng đây là đẹp hơn vì nó rõ ràng là an toàn, và vẫn an toàn nếu bạn thay đổi regexp. Tôi không nghĩ về hiệu suất.

2

Nếu không có biểu hiện thường xuyên không có cách trực tiếp để đạt được that.Alternatively bạn có thể sử dụng chức năng dưới đây để đạt được kết quả cần thiết của bạn:

func removeTrailingSpaces(with spaces : String) -> String{ 

     var spaceCount = 0 
     for characters in spaces.characters{ 
      if characters == " "{ 
       print("Space Encountered") 
       spaceCount = spaceCount + 1 
      }else{ 
       break; 
      } 
     } 

     var finalString = "" 
     let duplicateString = spaces.replacingOccurrences(of: " ", with: "") 
     while spaceCount != 0 { 
      finalString = finalString + " " 
      spaceCount = spaceCount - 1 
     } 

     return (finalString + duplicateString) 


    } 

Bạn có thể sử dụng chức năng này bằng cách sau: -

let str = " Himanshu " 
print(removeTrailingSpaces(with : str)) 
3

Đó là một chút hacky: D

let message = " example " 
var trimmed = ("s" + message).trimmingCharacters(in: .whitespacesAndNewlines) 
trimmed = trimmed.substring(from: trimmed.index(after: trimmed.startIndex)) 
6

này ngắn Swift 3 mở rộng chuỗi sử dụng tùy chọn .anchored và .backwards của rangeOfCharacter và sau đó gọi chính nó đệ quy nếu nó cần lặp lại. Bởi vì trình biên dịch đang mong đợi một CharacterSet làm tham số, bạn chỉ có thể cung cấp tĩnh khi gọi, ví dụ: "1234 ".trailing(.whitespaces) sẽ trả lại "1234". (Tôi đã không được thực hiện timings, nhưng mong chờ nhanh hơn so với regex.)

extension String { 
    func trailingTrim(_ characterSet : CharacterSet) -> String { 
     if let range = rangeOfCharacter(from: characterSet, options: [.anchored, .backwards]) { 
      return self.substring(to: range.lowerBound).trailingTrim(characterSet) 
     } 
     return self 
    } 
} 
3

Trong Swift 4

var trailingSpacesTrimmed: String { 
    var newString = self 

    while newString.hasSuffix(" ") { 
     newString = String(newString.dropLast()) 
    } 

    return newString 
} 
Các vấn đề liên quan