在C#正则表达式中正确使用字符组

时间:2012-01-13 04:01:18

标签: c# regex

有一种更好的方法可以将此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>

2 个答案:

答案 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)而不是正则表达式。