使用NSRegularExpression将NSString中的匹配替换为模板

时间:2013-04-04 14:42:07

标签: objective-c regex

我正在尝试在NSString中检测<br><Br>< br>,...并将其替换为\n。 我用NSRegularExpression编写了这段代码:

NSString *string = @"123 < br><br>1245; Ross <Br>Test 12<br>";
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"<[* ](br|BR|bR|Br|br)>" options:NSRegularExpressionCaseInsensitive error:&error];
NSString *modifiedString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@"\n"];


NSLog(@"%@", modifiedString);

它工作正常,但它只替换第一个匹配,而不是替换所有匹配。请帮我检测所有匹配并替换它们。 感谢

2 个答案:

答案 0 :(得分:2)

您目前无法处理任意数量的空白区域。为了更好地衡量,您还应该在br之后处理空格并处理结束斜杠,因为<br />是在HTML中编写换行符的正确方法。

你最终会得到一个看起来像这样的模式

<\s*(br|BR|bR|Br|br)\s*\/*>

或写为NSRegularExpression

NSError *error = NULL;
NSRegularExpression *regex = 
  [NSRegularExpression regularExpressionWithPattern:@"<\\s*(br|BR|bR|Br|br)\\s*\\/*>" 
                                            options:0 
                                              error:&error];

修改

您还可以通过分隔两个字母来使图案更紧凑

<\s*([bB][rR])\s*\/*>

答案 1 :(得分:1)

你已经关闭了,你需要让它在你的初始<之后处理任意数量的空格,如果它根本没有任何空间就处理它。

使用example,您可以使用正则表达式<\s*(br|BR|bR|Br|br)>让它在您的BR工作之前接受0 to N个空格。您还可以通过i使其不区分大小写来简化它,这样可以使用更清晰的正则表达式来处理您将看到的BR上的所有变体。 To do that,使用(?i)<\s*br>

我认为为了完整性,您还可以在br之后包含任意数量的空间,以便处理任何可能抛出的内容。我同意为/>添加某种类型的catch以结束模式,因为<br/>也是有效的HTML。它使正则表达式看起来更crazy,但它归结为仅添加其他3个。

(?i)<\s*br\s*\/?\s*>

它看起来非常可怕,但很简单地分解为几个部分:

  1. (?i)打开不区分大小写以处理br上的变体。
  2. <\s*是标记的开头,后面跟着任意数量的空格。
  3. br\s*是您的br字符,后跟任意数量的空格。
  4. \/?用于处理结束斜杠的0或1个实例(用于处理HTML <br/><br>等HTML有效标记。
  5. \s*>处理任意数量的空格,然后关闭>