如何在objective-c中更轻松地替换字符串中的单词

如何在objective-c中更轻松地替换字符串中的单词,objective-c,string,text,replace,nsstring,Objective C,String,Text,Replace,Nsstring,因此,我有一个文本字段,用户可以在其中键入任何内容。我使用以下代码为输入分配NSString值: NSString *input = _inputTextField.text; 如果用户在输入中的任何地方都有“智能”一词,那么它将替换为“智能”。同样,如果他们有更聪明的,它将取代它的聪明。我有以下代码来实现这一点: input = [input stringByReplacingOccurrencesOfString:@"smart" withString:@"clever"]; input

因此,我有一个文本字段,用户可以在其中键入任何内容。我使用以下代码为输入分配NSString值:

NSString *input = _inputTextField.text;
如果用户在输入中的任何地方都有“智能”一词,那么它将替换为“智能”。同样,如果他们有更聪明的,它将取代它的聪明。我有以下代码来实现这一点:

input = [input stringByReplacingOccurrencesOfString:@"smart" withString:@"clever"];
input = [input stringByReplacingOccurrencesOfString:@"smarter" withString:@"cleverer"];
现在这一切都很完美,但我在运行应用程序时遇到了一个问题。如果用户有任何包含smart的单词,例如smartweed,那么它将使其成为cleverweed,而cleverweed甚至不是一个单词。为了绕过此问题,我添加了以下代码:

input = [input stringByReplacingOccurrencesOfString:@"cleverweed" withString:@"smartweed"];
现在,我知道我不必对存在的每个包含smart的单词都这样做,所以我修改了代码,说:

input = [input stringByReplacingOccurrencesOfString:@" smart " withString:@" clever "];
嘿,这就解决了。但后来我遇到了一个问题。。。如果smart这个词是一个句子的开头,或者是一个句子的最后一个,那么它就不能解决这个问题!我可以通过添加以下内容来修复它:

input = [input stringByReplacingOccurrencesOfString:@"Smart " withString:@"Clever "];
input = [input stringByReplacingOccurrencesOfString:@" smart." withString:@" clever."];
等等,不管句子的结尾是什么

现在,我的官方问题是,有没有一种方法可以让代码在不改变其他单词中出现的单词smart的情况下,将smart替换成smart?我已经看过NSRange,但我不知道如何在这里正确使用它,因为它可能取决于用户的输入


另外,我试着搜索这个,但找不到

您必须搜索非字母+智能+非字母,其中非字母是可选的

在Safari中键入:

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);
导致:

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 *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将使其根据unicode而不是传统的正则表达式规则处理单词边界,而i使搜索不区分大小写。但是,请注意,虽然搜索不区分大小写,但替换内容仍然是您输入的文本字符串,即本例中的小写


您将遇到的问题是保持资本化、处理复数等。因此,在一天结束时,您将希望使用一个更强大的框架。

因此,我正在努力使其发挥作用,但它一直在第14行告诉我{is before the letterBehind=NO;错误发生在它告诉我修复第5行以添加一个]修复它之后。很抱歉,作为坏消息的传递者,但这实际上与将smart替换为smart的效果完全相同,甚至在包含smart的单词中也会发生。如果我将smart放在句子末尾,它实际上会冻结。不,它不会它在里面,但试图一次又一次地替换一个非替换词,而不是跳过它。推送了一个更新。我的第一行代码回答了你的问题。它必须这样做,文本字段的输入(不管用户键入什么)就是将被替换的词。用户可以键入一个段落,代码将搜索他想要的词t、 这很好!是的,你是对的,我会使用大写。我一直在尝试使用不区分大小写的方法,我找到的每一个解决方案,我的xcode总是给我一个错误,我不能使用不区分大小写的方法,即使当我复制相同的代码时。@BringMe115我关于文本字段相关性的评论提到了这样一个事实,即您的代码只包含大小写处理字符串,真的。它们来自文本字段并不是真的相关。添加了不区分大小写的搜索选项。不管怎样,你给了我一个简单得多的方法,这将涉及我摆脱一堆不必要的代码行。谢谢!!