tipos index funciones datos check characters swift

index - ¿Cómo compruebo si una cadena contiene otra cadena en Swift?



string contains swift (24)

En Swift 4.2

Utilizar

func contains(_ str: String) -> Bool

Ejemplo

let string = "hello Swift" let containsSwift = string.contains("Swift") print(containsSwift) // prints true

En Objective-C el código para verificar una subcadena en una NSString es:

NSString *string = @"hello Swift"; NSRange textRange =[string rangeOfString:@"Swift"]; if(textRange.location != NSNotFound) { NSLog(@"exists"); }

¿Pero cómo hago esto en Swift?


Forma de extensión

Swift 4

extension String { func contains(find: String) -> Bool{ return self.range(of: find) != nil } func containsIgnoringCase(find: String) -> Bool{ return self.range(of: find, options: .caseInsensitive) != nil } } var value = "Hello world" print(value.contains("Hello")) // true print(value.contains("bo")) // false print(value.containsIgnoringCase(find: "hello")) // true print(value.containsIgnoringCase(find: "Hello")) // true print(value.containsIgnoringCase(find: "bo")) // false

En general, Swift 4 tiene un método, sin embargo, está disponible desde iOS 8.0+

Swift 3.1

Puede escribir la extensión contains: y containsIgnoringCase para String

extension String { func contains(_ find: String) -> Bool{ return self.range(of: find) != nil } func containsIgnoringCase(_ find: String) -> Bool{ return self.range(of: find, options: .caseInsensitive) != nil } }

Versión Swift más antigua

extension String { func contains(find: String) -> Bool{ return self.rangeOfString(find) != nil } func containsIgnoringCase(find: String) -> Bool{ return self.rangeOfString(find, options: NSStringCompareOptions.CaseInsensitiveSearch) != nil } }

Ejemplo:

var value = "Hello world" print(value.contains("Hello")) // true print(value.contains("bo")) // false print(value.containsIgnoringCase("hello")) // true print(value.containsIgnoringCase("Hello")) // true print(value.containsIgnoringCase("bo")) // false


¡Aqui tienes! Listo para Xcode 8 y Swift 3.

import UIKit let mString = "This is a String that contains something to search." let stringToSearchUpperCase = "String" let stringToSearchLowerCase = "string" mString.contains(stringToSearchUpperCase) //true mString.contains(stringToSearchLowerCase) //false mString.lowercased().contains(stringToSearchUpperCase) //false mString.lowercased().contains(stringToSearchLowerCase) //true


A partir de Xcode 7.1 y Swift 2.1 containsString() funciona bien para mí.

let string = "hello swift" if string.containsString("swift") { print("found swift") }

Swift 4:

let string = "hello swift" if string.contains("swift") { print("found swift") }

Y un ejemplo de Swift 4 insensible a mayúsculas:

let string = "Hello Swift" if string.lowercased().contains("swift") { print("found swift") }

O usando una extensión de String insensible a mayúsculas y minúsculas:

extension String { func containsIgnoreCase(_ string: String) -> Bool { return self.lowercased().contains(string.lowercased()) } } let string = "Hello Swift" let stringToFind = "SWIFT" if string.containsIgnoreCase(stringToFind) { print("found: /(stringToFind)") // found: SWIFT } print("string: /(string)") print("stringToFind: /(stringToFind)") // console output: found: SWIFT string: Hello Swift stringToFind: SWIFT


Aquí está mi primera puñalada en esto en el patio de recreo rápido. Extiendo String proporcionando dos nuevas funciones (contiene y contieneIgnoreCase)

extension String { func contains(other: String) -> Bool{ var start = startIndex do{ var subString = self[Range(start: start++, end: endIndex)] if subString.hasPrefix(other){ return true } }while start != endIndex return false } func containsIgnoreCase(other: String) -> Bool{ var start = startIndex do{ var subString = self[Range(start: start++, end: endIndex)].lowercaseString if subString.hasPrefix(other.lowercaseString){ return true } }while start != endIndex return false } }

Usalo asi

var sentence = "This is a test sentence" sentence.contains("this") //returns false sentence.contains("This") //returns true sentence.containsIgnoreCase("this") //returns true "This is another test sentence".contains(" test ") //returns true

Me gustaría recibir cualquier comentario :)


Aquí estás:

let s = "hello Swift" if let textRange = s.rangeOfString("Swift") { NSLog("exists") }


Compruebe si contiene ''Hola''

let s = "Hello World" if s.rangeOfString("Hello") != nil { print("Yes it contains ''Hello''") }


De los documentos, parece que la función de funcionamiento de WITHSTRING containsString() en una cadena debería funcionar:

El tipo String de Swift se une perfectamente a la clase NSString de Foundation. Si está trabajando con Foundation framework en Cocoa o Cocoa Touch, toda la API de NSString está disponible para solicitar cualquier valor de String que cree, además de las funciones de String que se describen en este capítulo. También puede usar un valor de cadena con cualquier API que requiera una instancia de NSString.

Sin embargo, no parece funcionar de esa manera.

Si intentas usar someString.containsString(anotherString) , obtendrás un error de tiempo de compilación que indica que ''String'' does not contain a member named ''containsString'' .

Entonces, te quedan algunas opciones, una de las cuales es unir explícitamente tu String a Objective-C mediante el uso de bridgeToObjectiveC() otras dos involucran explícitamente el uso de una NSString y la última implica lanzar la String a una NSString

Al hacer un puente, obtendrías:

var string = "hello Swift" if string.bridgeToObjectiveC().containsString("Swift") { println("YES") }

Al escribir explícitamente la cadena como NSString , obtendrías:

var string: NSString = "hello Swift" if string.containsString("Swift") { println("YES") }

Si tiene un String existente, puede inicializar un NSString usando NSString (string :):

var string = "hello Swift" if NSString(string: string).containsString("Swift") { println("YES") }

Y, finalmente, puede lanzar una String existente a una NSString como se muestra a continuación

var string = "hello Swift" if (string as NSString).containsString("Swift") { println("YES") }


De todas las respuestas aquí, creo que o bien no funcionan, o son un poco piratas (volviendo a NSString). Es muy probable que la respuesta correcta a esto haya cambiado con las diferentes versiones beta.

Esto es lo que yo uso:

let string: String = "hello Swift" if string.rangeOfString("Swift") != nil { println("exists") }

El "! = Nil" se volvió necesario con Beta 5.


En Swift 3

if((a.range(of: b!, options: String.CompareOptions.caseInsensitive, range: nil, locale: nil)) != nil){ print("Done") }


En iOS 8 y posteriores, puede usar estos dos métodos NSString :

@availability(iOS, introduced=8.0) func containsString(aString: String) -> Bool @availability(iOS, introduced=8.0) func localizedCaseInsensitiveContainsString(aString: String) -> Bool


He encontrado un par de casos de uso interesantes. Estas variantes hacen uso del método rangeOfString e incluyo el ejemplo de igualdad para mostrar cómo se pueden usar mejor las funciones de búsqueda y comparación de Strings en Swift 2.0

//In viewDidLoad() I assign the current object description (A Swift String) to self.loadedObjectDescription self.loadedObjectDescription = self.myObject!.description

Más tarde, después de realizar cambios en self.myObject, puedo consultar las siguientes rutinas de comparación de cadenas (configuración como variables perezosas que devuelven un Bool). Esto permite verificar el estado en cualquier momento.

lazy var objectHasChanges : Bool = { guard self.myObject != nil else { return false } return !(self.loadedObjectDescription == self.myObject!.description) }()

Una variante de esto sucede cuando a veces necesito analizar una propiedad que falta en ese objeto. Una búsqueda de cadena me permite encontrar una subcadena particular que se establece en nil (el valor predeterminado cuando se crea un objeto).

lazy var isMissingProperty : Bool = { guard self.myObject != nil else { return true } let emptyPropertyValue = "myProperty = nil" return (self.myObject!.description.rangeOfString(emptyPropertyValue) != nil) ? true : false }()


No necesitas escribir ningún código personalizado para esto. A partir de la versión 1.2, Swift ya ha tenido todos los métodos que necesita:

  • obtener la longitud de la cadena: count(string) ;
  • comprobando si la cadena contiene subcadena: contains(string, substring) ;
  • comprobando si la cadena comienza con subcadena: startsWith(string, substring)
  • y etc.

Otro. Soporta mayúsculas y opciones diacríticas.

Swift 3.0

struct MyString { static func contains(_ text: String, substring: String, ignoreCase: Bool = true, ignoreDiacritic: Bool = true) -> Bool { var options = NSString.CompareOptions() if ignoreCase { _ = options.insert(NSString.CompareOptions.caseInsensitive) } if ignoreDiacritic { _ = options.insert(NSString.CompareOptions.diacriticInsensitive) } return text.range(of: substring, options: options) != nil } }

Uso

MyString.contains("Niels Bohr", substring: "Bohr") // true

iOS 9+

Estuche y función insensible al diacrítico disponible desde iOS 9.

if #available(iOS 9.0, *) { "Für Elise".localizedStandardContains("fur") // true }


Puedes hacer exactamente la misma llamada con Swift:

Swift 3.0+

var string = "hello Swift" if string.range(of:"Swift") != nil { print("exists") } // alternative: not case sensitive if string.lowercased().range(of:"swift") != nil { print("exists") }

Swift más viejo

var string = "hello Swift" if string.rangeOfString("Swift") != nil{ println("exists") } // alternative: not case sensitive if string.lowercaseString.rangeOfString("swift") != nil { println("exists") }

Espero que esta sea una solución útil ya que algunas personas, incluyéndome a mí, se encontraron con algunos problemas extraños al llamar a containsString() .

PD. No olvides import Foundation


Puedes hacerlo muy fácilmente en Swift usando el código:

let string = "hello Swift"; let subString = (string as NSString).containsString("Swift") if(subString){println("Exist")}


SWIFT 4 es muy fácil !!

if (yourString.contains("anyThing")) { Print("Exist") }


Solo puedes hacer lo que has mencionado:

import Foundation ... string.containsString("Swift");

De la documentación:

El tipo String de Swift se une perfectamente a la clase NSString de NSString . Si está trabajando con Foundation framework en Cocoa o Cocoa Touch, toda la API de NSString está disponible para solicitar cualquier valor de String que cree, además de las funciones de String que se describen en este capítulo. También puede usar un valor de cadena con cualquier API que requiera una instancia de NSString.

NSString import Foundation para salvar los métodos de NSString y ponerlos a disposición de la clase String de Swift.


Solo un addendum a las respuestas aquí.

También puede hacer una prueba local sin distinción de mayúsculas y minúsculas utilizando:

- (BOOL)localizedCaseInsensitiveContainsString:(NSString *)aString

Ejemplo:

import Foundation var string: NSString = "hello Swift" if string.localizedCaseInsensitiveContainsString("Hello") { println("TRUE") }

ACTUALIZAR

Esto es parte de Foundation Framework para iOS y Mac OS X 10.10.x y fue parte de 10.10 en el momento de mi publicación original.

Documento generado: 2014-06-05 12:26:27 -0700 OS X Release Notes Copyright © 2014 Apple Inc. Todos los derechos reservados.

OS X 10.10 Notas de la versión Cocoa Foundation Framework

NSString ahora tiene los siguientes dos métodos de conveniencia:

- (BOOL)containsString:(NSString *)str;

- (BOOL)localizedCaseInsensitiveContainsString:(NSString *)str;


Versión Xcode 8 / Swift 3:

let string = "hello Swift" if let range = string.range(of: "Swift") { print("exists at range /(range)") } else { print("does not exist") } if let lowercaseRange = string.lowercased().range(of: "swift") { print("exists at range /(lowercaseRange)") } else { print("does not exist") }

También puede utilizar contains :

string.contains("swift") // false string.contains("Swift") // true


string.containsString solo está disponible en 10.10 Yosemite (y probablemente iOS8). También unirlo a ObjectiveC se bloquea en 10.9. Estás intentando pasar un NSString a NSCFString. No sé la diferencia, pero puedo decir 10,9 barfs cuando ejecuta este código en una aplicación OS X 10.9.

Aquí están las diferencias en Swift con 10.9 y 10.10: https://developer.apple.com/library/prerelease/mac/documentation/General/Reference/APIDiffsMacOSX10_10SeedDiff/index.html contentsString solo está disponible en 10.10

El rango de la cadena anterior funciona muy bien en 10.9. Estoy descubriendo que el desarrollo en 10.9 es super estable con Xcode beta2. No uso los patios de recreo ni la versión de línea de comandos de los patios de recreo. Estoy descubriendo que si se importan los marcos adecuados, el autocompletar es muy útil.


> EN SWIFT 3.0

let str = "Hello Swift" if str.lowercased().contains("Swift".lowercased()) { print("String Contains Another String") } else { print("Not Exists") }

Salida

String Contains Another String



// Search string exist in employee name finding. var empName:NSString! = employeeDetails[filterKeyString] as NSString Case sensitve search. let rangeOfSearchString:NSRange! = empName.rangeOfString(searchString, options: NSStringCompareOptions.CaseInsensitiveSearch) // Not found. if rangeOfSearchString.location != Foundation.NSNotFound { // search string not found in employee name. } // Found else { // search string found in employee name. }