.net 使用正则表达式用XML标记包装部分文本
我们正在开发内部工具,为.NET产品生成文档 作为其功能的一部分,我们需要用.net 使用正则表达式用XML标记包装部分文本,.net,xml,regex,tags,.net,Xml,Regex,Tags,我们正在开发内部工具,为.NET产品生成文档 作为其功能的一部分,我们需要用标记包装普通段落 在此上下文中,“普通段落”意味着它是一行文本,可能带有一些类似内联XML的标记,但不在其他块标记(如或)内 源文件的一个示例: Description paragraph #1. Description paragraph #2. <code> Method1(); Method2(); </code> <list type="number"> <item&
标记包装普通段落
在此上下文中,“普通段落”意味着它是一行文本,可能带有一些类似内联XML的标记,但不在其他块标记(如
或
)内
源文件的一个示例:
Description paragraph #1.
Description paragraph #2.
<code>
Method1();
Method2();
</code>
<list type="number">
<item>
<description>
If you need to do something, use the <see cref="P:foo1" /> method.
</description>
</item>
<item>
<description> The <see cref="P:foo2" /> method does this.
The <see cref="P:foo3" /> method does that.</description>
</item>
</list>
<section>
<title>Section title</title>
<content>
Section paragraph #1.
Section paragraph #2.
</content>
</section>
应将其转换为以下内容:
<para>Description paragraph #1.</para>
<para>Description paragraph #2.</para>
<code>
Method1();
Method2();
</code>
<list type="number">
<item>
<description>
If you need to do something, use the <see cref="P:foo1" /> method.
</description>
</item>
<item>
<description> The <see cref="P:foo2" /> method does this.
The <see cref="P:foo3" /> method does that.</description>
</item>
</list>
<section>
<title>Section title</title>
<content>
<para>Section paragraph #1.</para>
<para>Section paragraph #2.</para>
</content>
</section>
从形式上讲,任务听起来是这样的:用..将每一行文本包装起来。。但这不仅仅是因为它不在其他标记的有限列表中。标签中的每个未来段落周围都允许使用空白,如CR/LF、制表符、空格字符等
显然,应该使用正则表达式来实现这一点,但我们还没有成功构建出适用于这种情况的东西。有什么想法或建议吗?你说“显然应该使用正则表达式”。很多人会说你在这个断言中遗漏了一个“不是”。看
如果您确信外部级别标记没有嵌套,则可以在一些可怕的正则表达式上拆分,如:
(<list([^<]|<(?!/list))+</list>)|(<code([^<]|<(?!/code))+</code>)|([^\n]+)
(很难从您的示例中推断出完整的需求,但是如果您的示例是典型的,那么在将提供的内容包装到
元素中以使其格式良好之后,以下XSLT 2.0样式表就可以完成这项工作:
<xsl:template match="/wrapper/*">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="/wrapper/text()">
<xsl:for-each select="tokenize(., '\n')">
<para><xsl:copy-of select="."/></para>
</xsl:for-each>
</xsl:template>
为什么不Method1();
,Method2();
在para
中。因为标记的内容被转换为结果HTML标记,应该按原样放置。外部标记的有限列表中有任何一个可以嵌套吗?如果是这样的话,你就不走运了。@NicholasW,在一般情况下-是的。但是如果没有解决方案,我们可以限制它。如果我们使用这个限制,有什么代码可以看吗?不要单独使用正则表达式:解析XML,然后使用XPath(或LINQ to XML)要查找不是您的子元素的文本节点,请设置“不更改”元素。然后处理该文本:如果它实际上只是每个单独的行(即换行符分隔),则使用字符串。拆分并创建
元素即可。