0

我正在尝试在 NSString 中检测<br>or <Br>or < 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);

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

4

2 回答 2

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*\/*>
于 2013-04-04T14:53:24.377 回答
1

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

使用您的示例,您可以使用正则表达式<\s*(br|BR|bR|Br|br)>让它0 to N在您的 BR 工作之前接受空格。您还可以通过使用 使其不区分大小写来进一步简化它i,这允许看起来更清晰的正则表达式来处理BR您将看到的所有变化。 为此,请使用(?i)<\s*br>.

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

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

它看起来真的很吓人,但很简单地分解成几个部分:

  1. (?i)打开不区分大小写以处理br.
  2. <\s*是标签的开头,紧跟任意数量的空格。
  3. br\s*是您的br字符后跟任意数量的空格。
  4. \/?是处理结束斜杠的 0 或 1 个实例(处理 HTML 有效标签,如<br/><br>.
  5. \s*>正在处理任意数量的空格,然后关闭>.
于 2013-04-04T14:47:05.553 回答