2012-04-27 33 views
8

Tôi đang tạo ứng dụng iPhone trên Twitter và cần phát hiện khi bạn nhập thẻ bắt đầu bằng # hoặc @ -mention trong chuỗi trong UITextView.Làm cách nào để bạn phát hiện các từ bắt đầu bằng “@” hoặc “#” trong một NSString?

Làm cách nào để tìm tất cả các từ đứng trước ký tự "@" hoặc "#" trong một NSString?

Cảm ơn sự giúp đỡ của bạn!

+0

làm bạn cần để có được những nhân vật trong chỉnh sửa hoặc sau khi chỉnh sửa (có thể bằng cách gọi một hành động)? theo thời điểm này tôi có thể giúp bạn – ilhnctn

Trả lời

22

Bạn có thể sử dụng lớp NSRegularExpression với mẫu như # \ w + (\ w là viết tắt của ký tự từ).

NSError *error = nil; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"#(\\w+)" options:0 error:&error]; 
NSArray *matches = [regex matchesInString:string options:0 range:NSMakeRange(0, string.length)]; 
for (NSTextCheckingResult *match in matches) { 
    NSRange wordRange = [match rangeAtIndex:1]; 
    NSString* word = [string substringWithRange:wordRange]; 
    NSLog(@"Found tag %@", word); 
} 
+0

Điều này là sai. Twitter gần đây đã cập nhật các bộ lọc hashtag, và bây giờ chỉ hỗ trợ một số ký tự không phải latin. Ví dụ: bạn sẽ không khớp với thẻ bắt đầu bằng # tiếng Ả Rập. –

+0

Đó phải là '\\ w +' chứ không phải '\ w +'. – sch

+0

ý nghĩa của + là gì? – Nil

0
if([[test substringToIndex:1] isEqualToString:@"@"] || 
    [[test substringToIndex:1] isEqualToString:@"#"]) 
{ 
    bla blah blah 
} 
+0

Đừng quên kiểm tra xem văn bản có dài hơn 1 trước khi thực hiện các hoạt động chuỗi con không. Nếu không, một số người dùng sẽ nhập một thông báo trống và bị điên khi ứng dụng gặp sự cố. –

2

Bạn có thể chia chuỗi thành từng phần (từ) bằng cách sử dụng componentsSeparatedByString: và sau đó kiểm tra ký tự đầu tiên của mỗi từ.

Hoặc, nếu bạn cần làm điều đó trong khi người dùng đang nhập, bạn có thể cung cấp đại biểu cho chế độ xem văn bản và triển khai textView: shouldChangeTextInRange: replaceText: để xem các ký tự đã nhập.

+1

Xác định ranh giới từ luôn luôn là ứng dụng cụ thể. componentsSeparatedByString: là một kỹ thuật khá, nhưng lập trình viên vẫn phải đưa ra quyết định về "hoặc là" hoặc "A1" và "neo bảo thủ" và một loạt các công trình xây dựng khác. –

+0

Thực hiện điều này tương tự dưới đây. Bạn đã có một điểm về ranh giới từ mặc dù. Người ta có thể tưởng tượng có hashtags như tôi # như/# tình yêu này. Hm .... – n13

1

Đã tạo danh mục NSString cho điều đó. Nó rất đơn giản: Tìm tất cả các từ, trả về tất cả các từ bắt đầu bằng # để lấy thẻ bắt đầu bằng #.

liên quan đoạn mã dưới đây - đổi tên các phương pháp đó & loại quá ...

@implementation NSString (PA) 
// all words in a string 
-(NSArray *)pa_words { 
    return [self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
} 

// only the hashtags 
-(NSArray *)pa_hashTags { 
    NSArray *words = [self pa_words]; 
    NSMutableArray *result = [NSMutableArray array]; 
    for(NSString *word in words) { 
     if ([word hasPrefix:@"#"]) 
      [result addObject:word]; 
    } 
    return result; 
} 
0

Đây là cách bạn có thể làm điều đó bằng NSPredicate

Bạn có thể thử một cái gì đó như thế này trong các đại biểu UITextView:

- (void)textViewDidChange:(UITextView *)textView 
{ 
    _words = [self.textView.text componentsSeparatedByString:@" "]; 
    NSPredicate* predicate = [NSPredicate predicateWithFormat:@"SELF BEGINSWITH[cd] '@'"]; 
    NSArray* names = [_words filteredArrayUsingPredicate:predicate]; 
    if (_oldArray) 
    { 
     NSMutableSet* set1 = [NSMutableSet setWithArray:names]; 
     NSMutableSet* set2 = [NSMutableSet setWithArray:_oldArray]; 
     [set1 minusSet:set2]; 
     if (set1.count > 0) 
      NSLog(@"Results %@", set1); 
    } 
    _oldArray = [[NSArray alloc] initWithArray:names]; 
} 

nơi _words, _searchResults và _oldArray là NSArrays.

0

Sử dụng biểu thức sau đây để phát hiện @ hay # trong chuỗi

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(#(\\w+)|@(\\w+)) " options:NSRegularExpressionCaseInsensitive error:&error]; 
Các vấn đề liên quan