【问题标题】:Format text from "HELLO, WORLD. HOW ARE YOU?" to "Hello, world. How are you?" in ObjC(iOS)?格式化文本“你好,世界。你好吗?” “你好,世界。你好吗?”在 ObjC(iOS) 中?
【发布时间】:2011-07-21 08:56:59
【问题描述】:

正如标题所说,我需要格式化一串文本,格式如下:“HELLO,WORLD。你好吗?”进入“你好,世界。你好吗?”,在 iOS 中是否有任何标准方法可以做到这一点?或者有没有示例代码?

谢谢!

【问题讨论】:

    标签: objective-c ios nsstring format capitalization


    【解决方案1】:

    我不知道执行此操作的标准方法,而且我认为没有。
    但是NSString 提供了这样的方法:-(NSString *)capitalizedString; 返回一个新字符串,每个单词的第一个字符 为大写。正确断开您的字符串后,您可以使用它。还可以考虑使用:-(NSString *)lowercaseString 获取小写字符串。

    【讨论】:

      【解决方案2】:

      没有直接的方法将段落中句子的第一个字符大写。 NSString 只是有一个方法 capitalizedString 将每个单词大写。您必须创建自己的逻辑来实现这一点。你可以试试下面的代码。

      - (NSString *)captilizeParagraph:(NSString *)paragraph {
      
          if ([paragraph length] == 0) return paragraph;
          NSArray *sentences = [paragraph componentsSeparatedByString:@". "];
          NSMutableArray *capitalizedSentences = [NSMutableArray array];
      
          for (NSString *sentence in sentences) {
      
              sentence = [sentence lowercaseString];
              sentence = [sentence stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[sentence substringToIndex:1] uppercaseString]];
              [capitalizedSentences addObject:sentence];
          }
      
          NSString *capitalizedParagrah = [capitalizedSentences componentsJoinedByString:@". "];
          return capitalizedParagrah;
      }
      

      注意: 上面的代码假定段落中的所有句子都以字符". "(一个点和一个空格)结尾,除了最后一句(它可以以任何字符结尾)。如果句子以"? ""! " 等其他字符结尾,则此方法将返回未完全格式化的字符串。

      【讨论】:

      • 非常感谢,我会努力改进它以满足我的需要。谢谢!
      • 如果我替换 [paragraph componentsSeparatedByString:@". "];与 [段落 componentsSeparatedByString:@".?!"]; ?
      • 没有。如果你这样做,它只会在字符串完全以字符串@".?! " 结尾时才拆分字符串。你可以使用componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"?!."],但是大写之后,你就很难再将它们加入到capitalizedParagrah中了。
      【解决方案3】:
      -(NSString *)normalizeString{
          __block NSString *string = [self lowercaseString];
          string = [string stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:[[string substringToIndex:1] uppercaseString]];
      
          NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[\\p{P}-[,]]" options:0 error:nil];
          [regex enumerateMatchesInString:string options:0 range:NSMakeRange(0, string.length) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
              if(result.range.location + 2 < string.length) string = [string stringByReplacingCharactersInRange:NSMakeRange(result.range.location + 2, 1) withString:[[self substringWithRange:NSMakeRange(result.range.location + 2, 1)] uppercaseString]];
          }];
      
          return string;
      }
      

      假设标点符号后的 2 个字符是下一个句子的第一个字符,这是可行的。

      【讨论】: