正则表达式将 XML 注释替换为 C# 属性

本文关键字:属性 替换 注释 XML 正则表达式 | 更新日期: 2023-09-27 18:33:10

我有一个XML模式,我正在尝试使用它来创建C#类。 目前,我正在使用XSD2Code来创建类。 原始架构的元素如下所示:

<xs:element name="NumberOfTags" type="xs:positiveInteger" minOccurs="0">
    <xs:annotation>
        <xs:documentation>ALT'N</xs:documentation>
    </xs:annotation>
</xs:element>

XSD2Code 生成的代码如下所示:

/// <summary>
/// ALT'N
/// </summary>
public string NumberOfTags { get; set; }

XML 注释引用映射到不同数据表示形式的 TMATS 代码。 我需要以某种运行时可读的表示形式捕获这些代码,以便能够以编程方式执行此映射。 到目前为止,实现此目的的最佳主意是将这些 XML 注释转换为 C# 属性,并编写其他代码来反映它们。


所以这是我的问题。 我想使用 Visual Studio Find and Replace 对 XSD2Code 生成的代码进行正则表达式样式替换,以便生成的代码如下所示:

[TmatsCode(@"ALT'N")]
public string NumberOfTags { get; set; }

实现这一目标的正则表达式是什么?

正则表达式将 XML 注释替换为 C# 属性

使用 Visual Studio 查找和替换

使用 Visual Studio 的 Find & Replace,您可以使用以下表达式:

^.*'<summary'>'n{:b*}///:b*{.*}'n.*'<'/summary'>$

而这个替换:

'1[TmatsCode(@"'2")]

分解一下:

  • ^.*'<summary'>'n - 在一行的开头匹配,任意数量的字符,直到后跟新行。
  • {:b*}///捕获任何空格,直到///字符。稍后我们将使用此捕获的空格,以便正确缩进属性。
  • :b*{.*}匹配任何空格,然后将其余部分捕获为我们想要的内容。
  • 'n.*'<'/summary'>$新行上的匹配项,然后直到结束摘要元素的行尾。

对于替换,'1是我们捕获的空格,因此属性缩进到同一位置,'2是摘要内容。

(?<=/// '<summary'>'r'n/// )[^'r'n]+(?='r'n/// '<'/summary'>)

将匹配

ALT'N

在您的示例中。

编辑:

VS 查找和替换?没注意到...以上是.net Regex。

但是,继续朝这个方向并回答您的评论......通过稍微重写正则表达式以匹配整个注释并捕获组中的内部值,Regex.Replace 的 MatchEvaluator 重载在这里独树一帜:

Regex.Replace(
 str,
 @"/// '<summary'>'r'n/// (?<tag>[^'r'n]+)'r'n/// '<'/summary'>",
 m => string.Format(
       "[TmatsCode(@'"{0}'"]",
       m.Groups["tag"].Value));