有一种更好的方法可以将此Regex简化为更简洁的格式,但我似乎无法正确实现字符组以供重用。关于如何更好地完成这场比赛的任何其他建议都会受到赞赏。
预期比赛:
<Formatting Type="B">any text</Formatting>
这可以嵌套在其他格式标签中,如此
<Formatting Type="B"><Formatting Type="I">any text</Formatting>any text</Formatting>
以下正则表达式可以解决问题,但似乎比应该更复杂,因为我重复了三次这个部分
最终目标是用标准HTML标记<Formatting
等替换<B> <I> <U>
的所有实例。
[\040\w!\?\:\.]*
整体正则表达式如下
<Formatting Type="[BIU]{1}">([\040\w!\?\:\.]*(<[BIU]>)*[\040\w!\?\:\.]*(</[BIU]>)*[\040\w!\?\:\.]*)*</Formatting>
答案 0 :(得分:2)
我认为这就是你想要的:
<Formatting Type="([BIU])">([ \w!?:.]*(?:</?[BIU]>[ \w!?:.]*)*)</Formatting>
除了区分<B>
,<I>
和<U>
标记之外,不需要单独制作用于打开和关闭HTML标记的作品。重要的是,在匹配开始<Formatting>
标记后,您不会在结束</Formatting>
标记之前使用任何更多开始标记。如果原始标记已正确嵌套,则HTML标记也将是。
我假设只有三种类型的格式,文本中不会有任何其他尖括号或类似标签的东西。在这种情况下,你不需要对正则表达式有如此限制。
text = Regex.Replace(text,
@"<Formatting Type=""([BIU])"">([^<]*(?:</?[BIU]>[^<]*)*)</Formatting>",
@"<$1>$2</$1>");
当然,您需要对文本进行多次传递,以确保已替换所有标记。给出您的示例文本:
<Formatting Type="B"><Formatting Type="I">any text</Formatting>any text</Formatting>
......在第一次通过后,它将改为:
<Formatting Type="B"><I>any text</I>any text</Formatting>
......并在第二次通过后:
<B><I>any text</I>any text</B>
答案 1 :(得分:1)
我认为你会发现这很困难,特别是因为格式化标签可以互相嵌套。
你可能希望避免像apparently this fellow StackOverflow user was那样被激怒。
This answer表明可以使用“平衡匹配”来完成。
您可能最好尝试使用XML技术来实现此目标(可能是XSLT)而不是正则表达式。