【问题标题】:Objective C: split text between brackets目标 C:在括号之间拆分文本
【发布时间】:2014-03-28 19:17:49
【问题描述】:

我需要拆分文本(NSString),看起来像这样:

[text],[more text here].

有没有办法做到这一点?我需要将括号之间的两个文本存储在 String[] 中,用“,”分隔。

【问题讨论】:

  • 所以你希望你的输出是text, more text here?作为单个字符串?
  • 您可能不想使用 C 字符串数组,而是使用 NSArray
  • 我尝试使用 componentSeparatedByString,但效果不佳...

标签: ios objective-c split


【解决方案1】:

您可以使用正则表达式和NSRegularExpression 来解决此问题。

构造一个匹配括号中的文本的模式。例如,模式@"\\[([^]]*)]" 匹配左括号\\[ - 需要反斜杠将括号视为文字字符,零个或多个字符(右括号[^]]* 除外),将文本分组以便引用([^]]*)和右括号]。您可以构建一个匹配逗号分隔的括号文本序列的模式,或者只查找括号文本的多个匹配项 - 取决于您的要求。

一旦你创建了正则表达式,使用regularExpressionWithPattern:options:error: 方法,matchesInString:options:range: 方法就可以用来获取所有匹配的数组。您可以处理此数组以生成所需的字符串数组。

【讨论】:

  • 谢谢!实际上,我已经在 iOS 中搜索了正则表达式的概念,并且我想出了如何去做!
【解决方案2】:

如果你只想转@"[text],[more text here]。"进入@"text, more text here",然后你可以使用扫描仪。

NSString *input = @"[text],[more text here]";

NSScanner *scanner = [NSScanner scannerWithString:input];

NSString *firstString;
NSString *secondString;

NSCharacterSet *openingBracketSet = [NSCharacterSet characterSetWithCharactersInString:@"["];
NSCharacterSet *closingBracketSet = [NSCharacterSet characterSetWithCharactersInString:@"]"];

while (![scanner isAtEnd]) {
    // Scan the opening brace, discarding the result
    [scanner scanString:@"[" intoString:NULL];

    // Scan the first string
    [scanner scanUpToCharactersFromSet:closingBracketSet intoString:&firstString];

    // Scan to the second opening brace, discarding the result
    [scanner scanUpToCharactersFromSet:openingBracketSet intoString:NULL];
    [scanner scanString:@"[" intoString:NULL];

    // Scan the second string
    [scanner scanUpToCharactersFromSet:closingBracketSet intoString:&secondString];
}

NSString *result = [NSString stringWithFormat:@"%@, %@", firstString, secondString];

NSLog(@"result: %@", result);

你可能认为这有点过头了,但是使用 NSScanners 是相当灵活的,而且知道它是一项有用的技能。

【讨论】:

    【解决方案3】:
    NSMutableArray * result = [NSMutableArray array];
    NSArray * commaSeparatedParenthesizedStrings = [input componentsSeparatedByString:@","];
    NSCharacterSet * bracketsToTrim = [NSCharacterSet characterSetWithCharactersInString:@"[]"];
    forin (NSString * s in commaSeparatedParenthesizedStrings) {
      [result addObject:[s stringByTrimmingCharactersInSet:bracketsToTrim]];
    }
    

    请注意,此解决方案不考虑括号的逗号,而且会从输入中删除所有括号,因此[[[[[]][[]]hello][][[[][][]][][], [[][[][]world[[]][[]][]] 将返回@[@"hello", @"world"]

    上面的 NSScanner 解决方案,或者类似的解决方案,应该更加健壮,以确保在拆分输入字符串时避免括号内的逗号。

    【讨论】:

      【解决方案4】:

      试试这个……

        NSString *testString = @"[more],[more te,xt here],[],[,,,,],[text3]";
        NSArray *array = [testString componentsSeparatedByString:@"],["];
        NSString *text = @"";
      
        for (int i = 0; i < array.count; i++){
          NSString *word = [array objectAtIndex: i];
          NSString *aux = @"";
          NSRange range;
          if(i == 0){
            range = NSMakeRange(1, word.length - 1);
          }
          else{
            aux = @",";
            if(i == array.count - 1)
              range = NSMakeRange(0, word.length - 1);
            else
              range = NSMakeRange(0, word.length);
          }
          aux = [aux stringByAppendingString:
            [word substringWithRange:range]];
          text = [text stringByAppendingString:aux];
        }
        NSLog(@"%@",text);
      

      【讨论】:

        猜你喜欢
        • 2019-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-31
        • 1970-01-01
        • 2020-12-21
        • 2017-02-16
        • 2015-05-08
        相关资源
        最近更新 更多