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

本文关键字:字符 正则表达式 | 更新日期: 2023-09-27 18:20:22

有一种更好的方法可以将Regex简化为更简洁的格式,但我似乎无法正确实现字符组以供重用。关于如何更好地完成这场比赛的任何其他建议都将得到重视。

预期匹配:

<Formatting Type="B">any text</Formatting>

这可以嵌套在其他格式化标签中,比如

<Formatting Type="B"><Formatting Type="I">any text</Formatting>any text</Formatting>

下面的Regex完成了这个技巧,但似乎比它应该的更复杂,因为我用这个部分重复了三次

最终目标是用标准HTML标签<B> <I> <U>等替换<Formatting的所有实例。

['040'w!'?':'.]*

总体Regex是以下

<Formatting Type="[BIU]{1}">(['040'w!'?':'.]*(<[BIU]>)*['040'w!'?':'.]*(</[BIU]>)*['040'w!'?':'.]*)*</Formatting>

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

我想这就是你想要的:

<Formatting Type="([BIU])">([ 'w!?:.]*(?:</?[BIU]>[ 'w!?:.]*)*)</Formatting>

打开和关闭HTML标记不需要有单独的产品,就像您需要区分<B><I><U>标记一样。重要的是,在匹配一个打开的<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>

我认为您会发现这非常困难,尤其是因为格式化标记可以嵌套在彼此之间。

你可能想避免被推向疯狂,就像这位StackOverflow用户一样。

这个答案表明,这可以通过使用"平衡匹配"来实现。

您最好尝试使用XML技术(可能是XSLT)而不是regex来实现这一点。