Bir NSString içeriğinde…?


124

Bir dizenin belirli bir kelime içerip içermediğini nasıl anlarım? Örneğin, aşağıda yazan bir dizem var:

@"Here is my string."

Örneğin "eşittir" gibi dizede bir kelime tespit edip edemeyeceğimi bilmek istiyorum.



26
bir cevabı kabul edebilir misin?
Jacob Relkin

Ucuz ve kirli bir çözüm, dizenin noktalama işareti içermediği varsayılırsa, HER İKİ dizenin önündeki ve arkasındaki boşlukları birleştirmek, sonra yapın rangeOfString.
Hot Licks

Yanıtlar:


192

İşte bunu nasıl yapacağım:

NSString *someString = @"Here is my string";
NSRange isRange = [someString rangeOfString:@"is " options:NSCaseInsensitiveSearch];
if(isRange.location == 0) {
   //found it...
} else {
   NSRange isSpacedRange = [someString rangeOfString:@" is " options:NSCaseInsensitiveSearch];
   if(isSpacedRange.location != NSNotFound) {
      //found it...
   }
}

Bunu kategori olarak kolayca şuraya ekleyebilirsiniz NSString:

@interface NSString (JRStringAdditions) 

- (BOOL)containsString:(NSString *)string;
- (BOOL)containsString:(NSString *)string
               options:(NSStringCompareOptions)options;

@end

@implementation NSString (JRStringAdditions) 

- (BOOL)containsString:(NSString *)string
               options:(NSStringCompareOptions)options {
   NSRange rng = [self rangeOfString:string options:options];
   return rng.location != NSNotFound;
}

- (BOOL)containsString:(NSString *)string {
   return [self containsString:string options:0];
}

@end

2
Aslında dizenin başına ve sonuna boşluk ekleyebilirsiniz ve "eşittir", dize "eşittir" ile başlar
user4951

Bunların standart sınıfın bir parçası olmaması beni şaşırtıyor. Teşekkürler @ Jacob!
big_m

1
Aslında, NSRange'nin "uzunluğu" test edilmelidir ... "location" değil. Burada doğrudan kaynaktan geliyor: "Bu yöntemler, hedef dizge bulunamazsa length == 0 değerini döndürür. Yani, kapsamı kontrol etmek için: ([ str rangeOfString: @ "target"]. length> 0). Bu yöntemlerle döndürülen aralığın uzunluğunun, oluşturulan karakterler ve benzeri nedeniyle hedef dizenin uzunluğundan farklı olabileceğini unutmayın. "
GtotheB

İOS 8.0'dan başlayarak, containsStringNSString'de maruz adında yeni bir yöntem var .
tedyyu

89

Kelimeyi cümle içinde taramak için aşağıdaki kodu kullanın.

NSString *sentence = @"The quick brown fox";
NSString *word = @"quack";
if ([sentence rangeOfString:word].location != NSNotFound) {
    NSLog(@"Yes it does contain that word");
}

Bu yöntemi bir dizide kullandığımda konumları nasıl alabilirim?
Hakim

Dizide aramayı ne kullandığınıza bağlıdır. Karşılaştırıcılar kullanmadan, en iyi yolun dizi boyunca döngü yapmak ve her dizeyi arama dizesi için kontrol etmek olduğunu düşünüyorum. NSString * searchString; for (NSString * dizide dizge) {if ([string rangeOfString: searchString options: NSCaseInsensitiveSearch] .location! = NSNotFound) {// Dize içinde değil} else {// Bu dizede}} Daha sonra bunu yapan dizeleri ekleyebilirsiniz aradığınızda onları göstermenizi sağlayan yeni bir değiştirilebilir diziye dahil edin
simon_smiley

ps Biçimlendirme yukarıdaki kodda tamamen doğru ancak açık bir şekilde bir yorumda
bulunarak eziliyor


3

NSLinguisticTagger'ı kullanmanızı tavsiye ederim . Aramak için kullanabilirizHere is my string. His isn't a mississippi isthmus. It is?

NSLinguisticTagger *linguisticTagger = [[NSLinguisticTagger alloc] initWithTagSchemes:@[
                                        NSLinguisticTagSchemeTokenType,
                                        ]
                                                                              options:
                                        NSLinguisticTaggerOmitPunctuation |
                                        NSLinguisticTaggerOmitWhitespace |
                                        NSLinguisticTaggerOmitOther ];
[linguisticTagger setString:@"Here is my string. His isn't a mississippi isthmus. It is?"];
[linguisticTagger enumerateTagsInRange:NSMakeRange(0,
                                                   [[linguisticTagger string] length])
                                scheme:NSLinguisticTagSchemeTokenType
                               options:
 NSLinguisticTaggerOmitPunctuation |
 NSLinguisticTaggerOmitWhitespace |
 NSLinguisticTaggerOmitOther |
 NSLinguisticTaggerJoinNames
                            usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) {
                                NSLog(@"tag: %@, tokenRange: %@, sentenceRange: %@, token: %@",
                                      tag,
                                      NSStringFromRange(tokenRange),
                                      NSStringFromRange(sentenceRange),
                                      [[linguisticTagger string] substringWithRange:tokenRange]);
                            }];

Bu çıktılar:

tag: Word, tokenRange: {0, 4}, sentenceRange: {0, 19}, token: Here
tag: Word, tokenRange: {5, 2}, sentenceRange: {0, 19}, token: is
tag: Word, tokenRange: {8, 2}, sentenceRange: {0, 19}, token: my
tag: Word, tokenRange: {11, 6}, sentenceRange: {0, 19}, token: string
tag: Word, tokenRange: {19, 3}, sentenceRange: {19, 33}, token: His
tag: Word, tokenRange: {23, 2}, sentenceRange: {19, 33}, token: is
tag: Word, tokenRange: {25, 3}, sentenceRange: {19, 33}, token: n't
tag: Word, tokenRange: {29, 1}, sentenceRange: {19, 33}, token: a
tag: Word, tokenRange: {31, 11}, sentenceRange: {19, 33}, token: mississippi
tag: Word, tokenRange: {43, 7}, sentenceRange: {19, 33}, token: isthmus
tag: Word, tokenRange: {52, 2}, sentenceRange: {52, 6}, token: It
tag: Word, tokenRange: {55, 2}, sentenceRange: {52, 6}, token: is

Görmezden geliyor His mississippive isthmushatta isiçini tanımlıyor isn't.


3

Umarım bu size yardımcı olur, .. bu satırı .m dosyasına ekleyin veya ayrı bir sınıf oluşturun ve bu kodu entegre edin.

@implementation NSString (Contains)

- (BOOL) containsString: (NSString*) substring
{
NSRange range = [self rangeOfString : substring];
BOOL found = ( range.location != NSNotFound );
return found;
}    
@end

2

İOS 8 ve Swift ile localizedCaseInsensitiveContainsString yöntemini kullanabiliriz

 let string: NSString = "Café"
 let substring: NSString = "É"

 string.localizedCaseInsensitiveContainsString(substring) // true

0

Tam bir çözüm önce dizeyi tarar (boşluklar eklenmeden), ardından hemen önceki karakterin boş mu yoksa satır başı mı olduğunu kontrol eder. Benzer şekilde, hemen sonraki karakterin boş mu yoksa satır sonu mu olduğunu kontrol edin. Her iki test de başarılı olursa, bir eşleşme var demektir. Ayrıca kontrol edebileceğiniz İhtiyaçlarınıza bağlı olarak ,, ., ()vb

Elbette alternatif bir yaklaşım, dizeyi kelimelere ayırmak ve her kelimeyi ayrı ayrı kontrol etmektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.