3

description (NSString 인스턴스)에 주어진 단어가 있는지 검색하고 싶습니다.NSString에서 NSPredicate를 통해 "전체 단어"검색

[NSPredicate predicateWithFormat:@"description CONTAINS[cd] %@", theWord]; 

그것은 작동하지만 하위 단어도 발견 :

나는이 술어했습니다. 주어진 예를 들어

, theWord : 그것은이 description 마하 것

자동차 :

대신

크리스마스 캐롤을, 내가 좋아하는 것 그거 내 술어는 a 또는 christmas 또는 carol과 일치합니다.

(I 코어 데이터 및 NSFetchRequest을 사용하고 있습니다.)이 같은

답변

13

뭔가?

NSString *matchStr = @".*\\bCarol\\b.*"; 

NSPredicate *pred =[NSPredicate predicateWithFormat: @"description MATCHES %@", matchStr]; 

NSArray *arr = @[ 
    @"A Christmas Carol", 
    @"Sing", 
    @"Song" 
]; 

NSArray *filtered = [arr filteredArrayUsingPredicate: pred]; 

비결은 문자열의 단어 경계를 표시 \b 메타 문자입니다. 정규식 패턴 문자열에 백 슬래시를 넣으려면 컴파일러에서 문자열에 실제 백 슬래시가 있어야한다는 것을 이해하기 위해 백 슬래시 앞에 다른 백 슬래시를 추가해야합니다. 따라서 문자열의 "\\ b".

또한 영어 이외의 언어 문자열을 더 잘 나타내려면 w 플래그 옵션을 설정하여 유니 코드 단어 경계를 검색 할 수 있도록 설정해야합니다. 일치 문자열은 다음과 같습니다.

NSString *matchStr = @"(?w).*\\bCarol\\b.*"; 
+3

사용자 입력을 (예 :'theWord ') 입력하려는 경우 이스케이프 처리를 권합니다. 그래서'matchStr'을'[NSString stringWithFormat : @ ". * \\ b % @ \ b. *", [NSRegularExpression escapedPatternForString : theWord]]'와 같이 만드십시오. 그렇지 않은 경우 사용자가 "Car. * l"을 입력하면 해당 입력은 정규 표현식으로 처리되고 잘못된 경우 충돌이 발생할 수 있습니다. –