在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>
我想这就是你想要的:
<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来实现这一点。