Swift - Usuń znak „z ciągu”

84

Mam ciąg „Opcjonalny („ 5 ”)”. Muszę usunąć znak „” otaczający 5. Usunąłem element „Opcjonalny”, wykonując:

text2 = text2.stringByReplacingOccurrencesOfString("Optional(", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)

Mam trudności z usunięciem znaków „, ponieważ oznaczają one koniec ciągu w kodzie.

Calan Williams
źródło
22
Jeśli łańcuch faktycznie składa się ze znaków, Optional("5")prawdopodobnie wcześniej coś poszło nie tak, ponieważ jest to opis opcjonalnego ciągu. Bardziej sensowne byłoby rozpakowanie opcjonalnego przed przypisaniem do text2, zamiast tekstowego usuwania „Opcjonalny (..)”.
Martin R

Odpowiedzi:

170

Swift używa odwrotnego ukośnika, aby uniknąć podwójnych cudzysłowów. Oto lista unikniętych znaków specjalnych w Swift:

  • \0 (znak pusty)
  • \\ (ukośnik wsteczny)
  • \t (zakładka pozioma)
  • \n (nowy wiersz)
  • \r (powrót karetki)
  • \" (cudzysłów)
  • \' (pojedynczy cudzysłów)

To powinno działać:

text2 = text2.replacingOccurrences(of: "\\", with: "", options: NSString.CompareOptions.literal, range: nil)
Sergey Kalinichenko
źródło
1
Niestety w przypadku Swift 1.2 wydaje się, że nie działa to na urządzeniach 32-bitowych.
PassKit
1
@GerardGrundy Bardzo dziękuję za komentarz! Zaktualizowałem odpowiedź, aby była kompatybilna z nowoczesną wersją Swift.
Sergey Kalinichenko
@Sergey Kalinichenko Cześć, jak mogę usunąć wiele zestawów znaków z jednego ciągu? Na przykład chcę usunąć „.mp3” lub „.m4a” w zależności od tego, co zawiera ciąg. Jak mogę to zrobić?
Wiaczesław
59

Swift 3 i Swift 4:

text2 = text2.textureName.replacingOccurrences(of: "\"", with: "", options: NSString.CompareOptions.literal, range:nil)

Najnowsze dokumenty zaktualizowane do Swift 3.0.1 zawierają:

  • Znak pusty ( \0)
  • Ukośnik odwrotny ( \\)
  • Tabulator poziomy ( \t)
  • Line Feed ( \n)
  • Powrót karetki ( \r)
  • Podwójny cudzysłów ( \")
  • Pojedynczy cudzysłów ( \')
  • Unicode scalar ( \u{n}), gdzie n to od jednej do ośmiu cyfr szesnastkowych

Jeśli potrzebujesz więcej informacji, zajrzyj do oficjalnej dokumentacji tutaj

Alessandro Ornano
źródło
28

Oto zaktualizowana odpowiedź szybkich 3

var editedText = myLabel.text?.replacingOccurrences(of: "\"", with: "")
Null Character (\0)
Backslash (\\)
Horizontal Tab (\t)
Line Feed (\n)
Carriage Return (\r)
Double Quote (\")
Single Quote (\')
Unicode scalar (\u{n})
Chathuranga Silva
źródło
Jest to znacznie czystszy sposób na zrobienie tego.
Super_Simon
9

Aby usunąć opcjonalne, wystarczy to zrobić

println("\(text2!)")

bo jeśli nie użyjesz "!" przyjmuje opcjonalną wartość text2

Aby usunąć „” z 5, musisz przekonwertować go na NSInteger lub NSNumber easy peasy. Ma "", ponieważ jest to ciąg.

Norolim
źródło
1
powinien najpierw sprawdzić, czy nie jest zerowy, w przeciwnym razie zgłosi wyjątek.
CW0007007
6

W końcu udało mi się to zadziałać na placu zabaw, mając wiele znaków, które próbuję usunąć z ciągu:

var otherstring = "lat\" : 40.7127837,\n"
var new = otherstring.stringByTrimmingCharactersInSet(NSCharacterSet.init(charactersInString: "la t, \n \" ':"))
count(new) //result = 10
println(new) 
//yielding what I'm after just the numeric portion 40.7127837
Getafix
źródło
1
Czy mógłbyś wyjaśnić: jakie pytanie jest tu zadawane?
milez
5

Jeśli chcesz usunąć więcej znaków, na przykład „a”, „A”, „b”, „B”, „c”, „C” z ciągu, możesz to zrobić w ten sposób:

someString = someString.replacingOccurrences(of: "[abc]", with: "", options: [.regularExpression, .caseInsensitive])
Grzegorz R. Kulesza
źródło
4

Jak mówi Martin R, Twój ciąg „Opcjonalnie („ 5 ”)” wygląda na to, że zrobiłeś coś złego.

dasblinkenlight odpowie ci, więc jest dobrze, ale dla przyszłych czytelników spróbuję dodać alternatywny kod jako:

if let realString = yourOriginalString {
    text2 = realString
} else {
    text2 = ""
}

text2 w twoim przykładzie wygląda jak String i być może jest już ustawiony na "", ale wygląda na to, że masz gdzieś yourOriginalString typu Optional (String), które nie zostało rzucone lub użyte poprawnie.

Mam nadzieję, że to pomoże niektórym czytelnikom.

Zapora
źródło
1
Można to nieco bardziej uprościć za pomocą operatora koalescencji zerowej, np let resultingString = optionalString ?? "".
Kilian,
4

Zamiana w celu usunięcia nie jest całkiem logiczna. String.filter pozwala na iterację łańcucha znaków po znaku i zachowanie tylko prawdziwego potwierdzenia.

Swift 4 i 5

var aString = "Optional(\"5\")"

aString = aString.filter { $0 != "\"" }

> Optional(5)

Lub przedłużyć

var aString = "Optional(\"5\")"

let filteredChars = "\"\n\t"

aString = aString.filter { filteredChars.range(of: String($0)) == nil }

> Optional(5)
Luc-Olivier
źródło
Przepraszam Luc, twój drugi przykład wyświetla komunikat o błędzie. Typ argumentu „String.Element” (znany również jako „Character”) nie jest zgodny z oczekiwanym typem „StringProtocol” .. Wydaje mi się, że coś przeoczyłeś?
user3069232
2

Powiedzmy, że masz ciąg:

var string = "potatoes + carrots"

Chcesz zamienić słowo „ziemniaki” w tym ciągu na „pomidory”

string = string.replacingOccurrences(of: "potatoes", with: "tomatoes", options: NSString.CompareOptions.literal, range: nil)

Jeśli wydrukujesz swój ciąg, będzie to teraz: "tomatoes + carrots"

Jeśli chcesz całkowicie usunąć słowo ziemniaki z żądła, możesz użyć:

string = string.replacingOccurrences(of: "potatoes", with: "", options: NSString.CompareOptions.literal, range: nil)

Jeśli chcesz użyć innych znaków w swoim żądle, użyj:

  • Znak pusty (\ 0)
  • Ukośnik wsteczny (\)
  • Tabulator poziomy (\ t)
  • Nowy wiersz (\ n)
  • Powrót karetki (\ r)
  • Cudzysłów (\")
  • Pojedynczy cudzysłów (\ ')

Przykład:

string = string.replacingOccurrences(of: "potatoes", with: "dog\'s toys", options: NSString.CompareOptions.literal, range: nil)

Wynik: "dog's toys + carrots"

Mini Official
źródło
To najprostszy i najskuteczniejszy sposób, aby to zrobić. Zamiast tego zmienia samą zmienną zamiast tworzyć nową. Starałem się wyjaśnić to w najlepszy możliwy sposób, więc pamiętaj, aby zagłosować za tą odpowiedzią.
Mini Official
0

Utworzyłeś wystąpienie text2 jako opcjonalne (np. Var text2: String?). Dlatego w swoim ciągu otrzymujesz parametr Optional („5”). zabrać? i zamień na:

var text2: String = ""
Ryan de Kwaadsteniet
źródło
0

Jeśli otrzymujesz wynik Optional(5)podczas próby wydrukowania wartości 5w opcjonalnym Int lub String , powinieneś najpierw rozpakować wartość:

if let value = text {
    print(value)
}

Teraz masz wartość bez ciągu „Optional”, który Swift dodaje, gdy wartość nie została wcześniej rozpakowana.

Ale Mohamad
źródło