NSRegularExpression删除行尾括号内的数字

时间:2015-07-16 08:48:19

标签: regex nsstring nsregularexpression

我觉得我已经筋疲力尽了我能想到的每一个正则表达式并阅读了我可以得到的每一份NSRegularExpression文档,但我仍然无法弄清楚这一点。

我有一些NSStrings以括号内的数字结尾(类似于" blah blah blah(33)"。我想删除括号,空格和数字,但仅当它匹配时行的结尾,并且仅当括号的内容仅为数字时(前一个示例为"等等等等等等)。我的正则表达式是接近的,但如果有非数字则匹配正则表达式中的字符,如果在括号后的字符串末尾有更多内容,它将匹配:

  NSArray *testStrings = @[@"hello (2)", @"hello (22)", @"hello (22) a", @"hello (2s)"];

  for (NSString *msg in testStrings) {

    NSError *error = NULL;
    NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern: @"[\\s\(\\d+\\)$]"
                                                                           options: NSRegularExpressionCaseInsensitive
                                                                             error: &error];

    if (!error) {

      NSLog(@"%lu", [regex numberOfMatchesInString:msg options:0 range:NSMakeRange(0, [msg length])]);

      NSString* plainText = [regex stringByReplacingMatchesInString: msg
                                                            options: 0
                                                              range: NSMakeRange(0, [msg length])
                                                       withTemplate: @""];

      NSLog(@"%@", plainText);
    }
  }

以下是输出:

test[93719:10248184] 4
test[93719:10248184] hello
test[93719:10248184] 5
test[93719:10248184] hello
test[93719:10248184] 6
test[93719:10248184] helloa
test[93719:10248184] 4
test[93719:10248184] hellos

感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

你应该使用

\s*\(\d+\)$

请参阅demo

在Objective-C中,decalre为@"\\s*\\(\\d+\\)$"

你的正则表达式 - [\s\(\d+\)$] - 将所有子模式括在方括号中,从而创建一个匹配1个字符的字符类:空格,或(,或数字,或+,或{ {1}}或)

因此,您需要删除方括号,并在空白速记类$中添加*量词,以便可以匹配所有前导空格。