1

我需要把这样的东西

NSString *stringWithParentheses = @"This string uses (something special)";

以编程方式进入这一点。

NSString *normalString = @"This string uses";

问题是我不想使用所有这些奇怪的库、正则表达式等。

4

3 回答 3

5

如果您对正则表达式改变主意,这里有一个简短、干净的解决方案:

NSString *foo = @"First part (remove) (me (and ((me)))))) (and me) too))";
NSRegularExpression *expr = [NSRegularExpression regularExpressionWithPattern:@"\\(.*\\)" options:0 error:NULL];
NSString *bar = [expr stringByReplacingMatchesInString:foo options:0 range:NSMakeRange(0, foo.length) withTemplate:@""];

(和之间的所有内容都)被删除,包括任何嵌套的括号和括号内不匹配的括号。

于 2013-03-19T23:34:55.610 回答
4

只需找到第一个左括号,记下它的索引,找到右括号,记下它的索引,然后删除索引之间的字符(包括索引本身)。

要查找字符,请使用:

[string rangeOfString:@"("];

要删除范围:

[string stringByReplacingCharactersInRange:...  withString:@""];

这是一个解决方案:

NSString* str = @"This string uses (something special)";
NSRange rgMin = [str rangeOfString:@"("];
NSRange rgMax = [str rangeOfString:@")"];

NSRange replaceRange = NSMakeRange(rgMin.location, rgMax.location-rgMin.location+1);

NSString* newString = str;

if (rgMin.location < rgMax.location)
{
    newString = [str stringByReplacingCharactersInRange:replaceRange withString:@""];
}

它不适用于嵌套括号。或多个括号。但它适用于您的示例。这将根据您的具体情况进行细化。

于 2013-03-19T23:04:07.930 回答
3

一种方法是找到“(”字符的第一次出现和“)”字符的最后一次出现的位置,并通过消除这些范围之间的所有字符来构建子字符串。我做了一个例子:

NSString* str= @"This string uses (something special)";
NSRange r1=[str rangeOfString: @"("];
NSRange r2= [str rangeOfString: @")" options: NSBackwardsSearch];
NSLog(@"%@",[str stringByReplacingCharactersInRange: NSMakeRange(r1.location, r2.location+r2.length-r1.location) withString: @""]);
于 2013-03-19T23:02:56.143 回答