正则表达式来获取[a]和[/]之间的字符串,不包括任何其他标签,例如[b] [/ b]

时间:2009-07-28 04:21:28

标签: c# regex

我有如下输入

[a href=http://twitter.com/suddentwilight][font][b][i]@suddentwilight[/font][/a] My POV: Rakhi Sawant hits below the belt & does anything for attention... [a href=http://twitter.com/mallikaLA][b]http://www.test.com[/b][/a] has maintained the grace/decency :)

现在我需要获取锚标记内的字符串@suddentwilighthttp://www.test.com。可能有一些[b]或[i]标签包装实际文本。我需要忽略它。

基本上我需要获得以[a]开头的字符串匹配,然后需要在关闭标记[/a]之前获取字符串/ url。

请建议

1 个答案:

答案 0 :(得分:3)

我不知道C#,但这是一个正则表达式:

/\[a\s+[^\]]*\](?:\[[^\]]+\])*(.*?)(?:\[[^\]]+\])*\[\/a\]/

这将匹配[a ...][tag1][tag2][...][tagN]text[/tagN]...[tag2][tag1][/a]并捕获text

解释:

  • /.../是常见的正则表达式分隔符(如字符串的双引号)。 C#可能只是使用字符串来初始化正则表达式 - 在这种情况下,不需要正斜杠。
  • \[\]匹配文字[]字符。我们需要用反斜杠来逃避它们,因为方括号在正则表达式中具有特殊含义。
  • [^\]]是一个字符类的示例 - 这里的意思是任何不是方括号的字符。方括号分隔字符类,插入符号(^)表示否定,转义的紧密方括号是被否定的字符。
  • *+是后缀,分别表示匹配0或更多以及前一个模式的1个或多个。因此,[^\]]*表示匹配0或更多除紧密方括号外的任何内容。
  • \s是空格字符的字符类的简写
  • (?:...)允许您将内容分组为原子模式。
  • (...)这样的
  • (?:...)组,但也保存了正则表达式的这部分匹配到变量中的子字符串。这通常称为 capture ,因为它捕获字符串的这一部分供您稍后使用。在这里,我们使用捕获来获取linktext。
  • .匹配任何单个字符。
  • *?是非贪婪匹配的后缀。通常情况下,*后缀是贪婪的,尽可能匹配,同时仍然允许模式的其余部分匹配某些内容。 *?是相反的 - 它尽可能地匹配,同时仍然允许模式的其余部分匹配某些东西。我们在此使用*?而不是*的原因是,如果我们在一行上有多个[/a],我们只会在匹配链接文字时使用下一个{。}}。

这只会删除文本开头和结尾的[tag],以删除文本中间的任何内容(如[a href=""]a [b]big[/b] frog[/a]),您需要执行此操作从第一个开始捕获第二个,擦除任何匹配的文本:

/\[[^\]]+\]/