目标 C:在括号之间拆分文本

Posted

技术标签:

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

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

[text],[more text here].

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

【问题讨论】:

所以你希望你的输出是text, more text here?作为单个字符串? 您可能不想使用 C 字符串数组,而是使用 NSArray 我尝试使用 componentSeparatedByString,但效果不佳... 【参考方案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);

【讨论】:

以上是关于目标 C:在括号之间拆分文本的主要内容,如果未能解决你的问题,请参考以下文章

[原创]C++, 利用std::wifstream和std::getline方式对目标字符串进行拆分

根据变长分隔符拆分熊猫字符串列

正则表达式拆分和忽略括号

如何在嵌套括号之间获取文本?

如何在 c++ 中将字符串拆分为左括号和右括号之间的字符串列表?

如何在目标 c 中使用步进器缩放 UitextView 中的文本