我有如下输入
[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 :)
现在我需要获取锚标记内的字符串@suddentwilight
和http://www.test.com
。可能有一些[b]或[i]标签包装实际文本。我需要忽略它。
基本上我需要获得以[a]
开头的字符串匹配,然后需要在关闭标记[/a]
之前获取字符串/ url。
请建议
答案 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]
),您需要执行此操作从第一个开始捕获第二个,擦除任何匹配的文本:
/\[[^\]]+\]/