【问题标题】:Replace multiple spaces with a newline but leave single spaces用换行符替换多个空格,但保留单个空格
【发布时间】:2014-02-11 06:09:16
【问题描述】:

我正在尝试操纵NSString。我想整理输出。如果一行中有多个空格,则应替换为换行符。

NSString *myString = @"Name: Tom Smith           Old address       street name : 31 Fox Road      Dixton       0000";

我想要的来自NSLog()的输出:

姓名:汤姆·史密斯 旧地址 街道名称:福克斯路 31 号 迪克斯顿 0000

这是我一直在研究的一些逻辑。我不确定它是否正确。

    if (word_spacing > 1)
        insert word in new line "\n"
    else
        carry on from the same line

【问题讨论】:

标签: ios objective-c string cocoa nsstring


【解决方案1】:

您可以使用NSCharacterSetcomponentsSeparatedByString 来做到这一点。

解决方案:

// Your string
NSString *myString = @"Name: Tom Smith           Old address       street name : 31 Fox Road      Dixton       0000";

// Seperating words which have more than 1 space with another word
NSArray *components    = [myString componentsSeparatedByString:@"  "];
NSString *newString    = @"";
NSString *oldString    = @"";
for (NSString *tempString in components)
{
    // Creating new string
    newString = [oldString stringByAppendingString:[tempString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];

    // Avoiding new line characters or extra spaces contained in the array
    if (![oldString isEqualToString:newString])
    {
        newString = [newString stringByAppendingString:@"\n"];
        oldString = newString;
    }
}
NSLog(@"%@",newString);

你可以使用NSRegularExpression

NSString *pattern = [NSString stringWithFormat:@"  {2,%d}",[myString length]];

NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];

NSString *output = [regex stringByReplacingMatchesInString:myString options:0 range:NSMakeRange(0, [myString length]) withTemplate:@"\n"];
NSLog(@"%@", output);

【讨论】:

    【解决方案2】:

    你可以试试看:

    NSArray *results = [myString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@":"]],

    wich 返回一个数组,其中包含来自接收者的子字符串,这些子字符串已被给定集合中的字符分割。

    一旦你有了这个结果,只需循环以 2 递增的结果,你就会得到键值对。然后,您可以使用以下方法对每个键值对的值进行某种修剪:

    NSString *trimmedString = [string stringByTrimmingCharactersInSet:
                                      [NSCharacterSet whitespaceCharacterSet]]; 
    

    【讨论】:

      【解决方案3】:

      您可以按您想要的字符(在您的情况下是多个空格)分割字符串,如下所示:

      NSArray * components = [myString componentsSeparatedByString: @"  "];
      

      然后你可以打印出每个组件后跟一个换行符:

      for (NSString * component in components) {
          NSLog(@"%@\n",component);
      }
      

      【讨论】:

        【解决方案4】:

        如果您在字符串之间存在不可预测的情况,并且您想用new line 替换多个空格,那么您应该使用正则表达式。您使用的正则表达式将不起作用,因为它选择空格 one or more time 但实际上您想选择 two or more times

        我知道这个线程已经解决了,但也可以看看这个示例:

        NSString *myString = @"Name: Tom Smith           Old address       street name : 31 Fox Road      Dixton       0000";
        
        NSError *error = nil;
        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\s{2,}" options:NSRegularExpressionCaseInsensitive error:&error];
        
        NSArray *arr = [regex matchesInString:myString options:NSMatchingReportCompletion range:NSMakeRange(0, [myString length])];
        
        arr = [[arr reverseObjectEnumerator] allObjects];
        
        for (NSTextCheckingResult *str in arr) {
            myString = [myString stringByReplacingCharactersInRange:[str range] withString:@"\n"]; }
        
        NSLog(@"%@", myString);
        

        输出日志:

        Name: Tom Smith
        Old address
        street name : 31 Fox Road
        Dixton
        0000
        

        Live Demo

        【讨论】:

        • Regex 是正确的解决方案,当然,但为什么不直接使用 -[NSRegularExpression stringByReplacingMatchesInString:options:range:withTemplate:]
        • 这是一个可能的选择。
        【解决方案5】:

        //调用类似的方法:

            NSString *descriptionStr = [self stringByRemovingBlankLines:string];;
        

        //方法

        - (NSString *)stringByRemovingBlankLines : (NSString *)stringValue
        {
        NSScanner *scan = [NSScanner scannerWithString:stringValue];
        NSMutableString *string = NSMutableString.new;
        while (!scan.isAtEnd) {
            [scan scanCharactersFromSet:NSCharacterSet.newlineCharacterSet intoString:NULL];
            NSString *line = nil;
            [scan scanUpToCharactersFromSet:NSCharacterSet.newlineCharacterSet intoString:&line];
            if (line) [string appendFormat:@"%@\n",line];
        }
        if (string.length) [string deleteCharactersInRange:(NSRange){string.length-1,1}]; // drop last '\n'
        return string;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-12
          • 2012-06-04
          相关资源
          最近更新 更多