在RTF中,{和}标记一个组。组可以嵌套。\标记控制字的开头。控制字以空格或非字母字符结尾。控制字后面可以有一个数字参数,中间没有定界符。一些控制字还带有文本参数,以“;”分隔。这些控制字通常在自己的组中。
我认为我已经设法制定出可以处理大多数情况的模式。
\{\*?\\[^{}]+}|[{}]|\\\n?[A-Za-z]+\n?(?:-?\d+)?[ ]?
但是在您的模式上运行时会留下一些空间。
通过RTF规范(其中的一些规范),我发现纯正则表达式剥离器存在很多陷阱。最明显的一个是应忽略某些组(页眉,页脚等),而其他组应进行渲染(格式化)。
我编写了一个Python脚本,该脚本应该比上面的正则表达式更好:
def striprtf(text):
pattern = re.compile(r"\\([a-z]{1,32})(-?\d{1,10})?[ ]?|\\'([0-9a-f]{2})|\\([^a-z])|([{}])|[\r\n]+|(.)", re.I)
# control words which specify a "destionation".
destinations = frozenset((
'aftncn','aftnsep','aftnsepc','annotation','atnauthor','atndate','atnicn','atnid',
'atnparent','atnref','atntime','atrfend','atrfstart','author','background',
'bkmkend','bkmkstart','blipuid','buptim','category','colorschememapping',
'colortbl','comment','company','creatim','datafield','datastore','defchp','defpap',
'do','doccomm','docvar','dptxbxtext','ebcend','ebcstart','factoidname','falt',
'fchars','ffdeftext','ffentrymcr','ffexitmcr','ffformat','ffhelptext','ffl',
'ffname','ffstattext','field','file','filetbl','fldinst','fldrslt','fldtype',
'fname','fontemb','fontfile','fonttbl','footer','footerf','footerl','footerr