我想获取一些 RTF 输入并清理它以删除除 \ul \b \i 之外的所有 RTF 格式,以将其粘贴到带有次要格式信息的 Word 中。

用于粘贴到 Word 中的命令类似于:oWord.ActiveDocument.ActiveWindow.Selection.PasteAndFormat(0)(剪贴板中已有一些 RTF 文本)

{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Courier New;}}
{\colortbl ;\red255\green255\blue140;}
\viewkind4\uc1\pard\highlight1\lang3084\f0\fs18 The company is a global leader in responsible tourism and was \ul the first major hotel chain in North America\ulnone  to embrace environmental stewardship within its daily operations\highlight0\par

你知道如何使用一些正则表达式或其他东西安全地清理 RTF 吗?我使用 VB.NET 进行处理,但任何 .NET 语言示例都可以。

有帮助吗?

解决方案

我将使用隐藏的 RichTextBox,设置 Rtf 成员,然后检索 Text 成员,以良好支持的方式清理 RTF。然后我会手动注入所需的格式。

其他提示

我会做类似以下的事情:

Dim unformatedtext As String

someRTFtext = Replace(someRTFtext, "\ul", "[ul]")
someRTFtext = Replace(someRTFtext, "\b", "[b]")
someRTFtext = Replace(someRTFtext, "\i", "[i]")

Dim RTFConvert As RichTextBox = New RichTextBox
RTFConvert.Rtf = someRTFtext
unformatedtext = RTFConvert.Text

unformatedtext = Replace(unformatedtext, "[ul]", "\ul")
unformatedtext = Replace(unformatedtext, "[b]", "\b")
unformatedtext = Replace(unformatedtext, "[i]", "\i")

Clipboard.SetText(unformatedtext)

oWord.ActiveDocument.ActiveWindow.Selection.PasteAndFormat(0)

您可以使用正则表达式删除标签。只需确保您的表达式不会过滤实际上是文本的标签。如果文本正文中包含“\b”,则它将在 RTF 流中显示为 \b。换句话说,您将匹配“\b”,但不匹配“\b”。

您或许可以采取捷径并过滤掉标头 RTF 标签。查找输入中第一次出现的“\viewkind4”。然后向前读到第一个空格字符。您将删除从文本开头一直到该空格字符的所有字符。这将删除 RTF 标头信息(字体、颜色等)。

正则表达式它不会完全正确地解析所有内容(例如表格),但在大多数情况下都能完成工作。

string unformatted = Regex.Replace(rtfString, @"\{\*?\\[^{}]+}|[{}]|\\\n?[A-Za-z]+\n?(?:-?\d+)?[ ]?", "");

魔法=)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top