2014-06-13 5 views
0

그래서 사용자가 무엇이든 입력 할 수있는 텍스트 필드가 있습니다. 사용자가 단어가 "영리"로 대체됩니다보다는 아무 곳이나 입력의 "스마트"가있는 경우객관적인 -c에서 문자열의 단어를 쉽게 바꾸는 방법

NSString *input = _inputTextField.text; 

: I는 입력을있는 NSString 값을 할당하려면 다음 코드를 사용합니다. 똑같이 "똑똑하다"면 "똑똑하다"로 바꿀 것이다. 나는 이것을 달성하기 위해 다음과 같은 코드가 있습니다

input = [input stringByReplacingOccurrencesOfString:@"smart" withString:@"clever"]; 
input = [input stringByReplacingOccurrencesOfString:@"smarter" withString:@"cleverer"]; 

이제이 완벽하게 작동을하지만 응용 프로그램을 실행하는 동안 나는 문제에 부딪쳤다. 사용자가 'smartweed'와 같이 'smart'가 포함 된 단어가있는 경우 단어가 아닌 'cleverweed'로 변경됩니다. 이 문제를 우회하기 위해, 나는 다음과 같은 코드를 추가 : 이제

input = [input stringByReplacingOccurrencesOfString:@"cleverweed" withString:@"smartweed"]; 

을, 나는 그 그것으로 "스마트"가 존재하는 모든 단어에 그렇게하지 않아도 알고, 그래서에 코드를 변경 다음과 같이 말하십시오.

input = [input stringByReplacingOccurrencesOfString:@" smart " withString:@" clever "]; 

안녕하세요. 하지만 문제가 발생했습니다 ... "스마트"라는 단어가 문장의 시작 부분이나 문장의 마지막 부분이라면 문제를 해결하지 못할 것입니다! 다음을 추가하여 문제를 해결할 수 있습니다.

input = [input stringByReplacingOccurrencesOfString:@"Smart " withString:@"Clever "]; 
input = [input stringByReplacingOccurrencesOfString:@" smart." withString:@" clever."]; 

등등.

내 공식 질문은 코드가 "스마트"를 "영리한"것으로 바꾸고 다른 단어 안에 "스마트"라는 단어를 변경하지 않는 방법이 있습니까? 나는 NSRange를 살펴 봤지만, 사용자가 무엇을 입력했는지에 의존 할 수 있기 때문에 여기에서 제대로 사용하는 방법을 혼란 스럽다.

또한 검색을 시도했지만 찾을 수 없습니다.

답변

0

질문은 사실 명확하지 않습니다 (제목에 언급 된 텍스트 필드는 무엇을해야합니까?). 후드에서는 주제 인 자연 언어 처리를 처리합니다. 그것을 처리 할 것

NSString *text = @"This is a smart dog that avoids eating the smartweed"; 

NSString *pattern = @"(?wi)\\bsmart\\b"; 

NSString *result = [text stringByReplacingOccurrencesOfString: pattern 
                withString: @"clever" 
                 options: NSRegularExpressionSearch 
                 range: NSMakeRange(0, [text length]) ];  

\b는 괄호 안의 정규 표현식과 w에 단어 경계를 식별

어쨌든, 당신이 언급 문제를 해결 직선 대체를 들어, 정규 표현식을 사용할 수 있습니다 단어의 경계는 유니 코드 (전통적인 정규 표현식 규칙보다는)에 따라 다르지만 i은 검색 대소 문자를 구분하지 않습니다.검색에서 대소 문자를 구분하지 않지만 대체 문자는 입력 한 리터럴 문자열 (예 :이 예에서는 소문자)입니다.

대문자 유지, 복수형 처리 등의 문제는 결국보다 강력한 프레임 워크를 사용해야 할 것입니다.

+0

내 첫 번째. 코드 줄이 당신의 질문에 답합니다. 사용자 입력 내용이 무엇이든간에 TextField의 입력은 대체 될 단어입니다. 사용자는 단락을 입력 할 수 있으며, 코드는 그가 말한 단어. 이것은 완벽하게 작동합니다! 네 말이 맞아요, 저는 대문자로 진행될 것입니다. 저는 대소 문자를 구분하지 않고 모든 솔루션을 사용하려고했습니다. 제 xcode는 항상 코드를 복사 할 때도 대소 문자를 구분하지 않는 오류를 제공합니다. –

+2

@ BringMe115 텍스트 필드의 관련성에 대한 내 의견은 코드가 문자열만을 처리한다는 사실을 언급했습니다. 텍스트 필드에서 왔음은 사실 적절하지 않습니다. 대소 문자를 구별하지 않는 옵션을 추가했습니다. – Monolo

+0

어느 쪽이든, 불필요한 코드 줄을 없애는 훨씬 쉬운 방법을 제공했습니다. 감사!! –

0

nonletter + "smart"+ nonletter를 검색해야합니다. 여기서 non letter는 선택 사항입니다.

사파리에 입력 : 문자열의 범위

2014-06-13 13:54:41.702 kkk[4216:303] <smart and smartweed and smart> 
2014-06-13 13:54:41.703 kkk[4216:303] clever< and smartweed and smart> 
2014-06-13 13:54:41.704 kkk[4216:303] clever and smart<weed and smart> 
2014-06-13 13:54:41.705 kkk[4216:303] clever and smartweed and clever 

강령 검색 :

NSString *string = @"smart and smartweed and smart"; // From text field 
NSString *searchWord = @"smart"; 
NSString *newString = @"clever"; 
NSRange wordRange; 
NSCharacterSet *letters = [NSCharacterSet letterCharacterSet]; 
NSRange searchRange = NSMakeRange(0, [string length]); 
while ((wordRange=[string rangeOfString:searchWord options:0 range:searchRange]).length!=0) 
{ 
    NSLog(@"%@<%@>", [string substringToIndex:searchRange.location], [string substringFromIndex:searchRange.location]); 
    BOOL hasLetterAhead = YES; 
    if ( (wordRange.location==0) 
     || !([letters characterIsMember:[string characterAtIndex:wordRange.location-1]])) 
    { 
    hasLetterAhead = NO; 
    } 

    BOOL hasLetterBehind = YES; 
    if ( (wordRange.location+wordRange.length>=[string length]) 
     || !([letters characterIsMember:[string characterAtIndex:wordRange.location+wordRange.length]])) 
    { 
    hasLetterBehind = NO; 
    } 

    if (!hasLetterAhead && !hasLetterBehind) 
    { 
    string = [string stringByReplacingCharactersInRange:wordRange withString:newString]; 
    searchRange.location = wordRange.location + newString.length; 
    } 
    else 
    { 
    searchRange.location = wordRange.location + wordRange.length; 
    } 
    searchRange.length = [string length]-searchRange.location; 
} 

NSLog(@"%@", string); 

에 이르게. 그런 다음 텍스트의 시작 부분에서 시작하든 문자 앞에 나오지 않던간에 보입니다. 그것은 결국 동일합니다. 직접 정확한 색인 계산을 확인하십시오. : -]

+0

그래서 나는 그것을 만들려고 노력하고있다 "14"줄에 "기대") "letterBehind = NO; 전에 –

+0

줄 5을 수정하라는 메시지가 나타납니다. "]"을 추가하십시오 –

+0

나쁜 소식을 전하는 사람이되어서 미안하지만 실제로는 "똑똑한"단어를 "똑똑한"단어로 바꾸는 것과 똑같은 방식으로 작동하며 "똑똑한"단어가 포함 된 단어에서도 똑같이 작동합니다. 그리고 –

관련 문제