我正在使用正则表达式从AutoCAD MTEXT(多行)字符串中清除格式控制字符。在MTEXT字符串的语法中,字面反向固相字符(\
)就像在正则表达式模式中那样被转义,即\\
,以及格式化控制字符串的示例(在这种情况下,用于更改字体) )如下:
\fArial Narrow|b0|i0|c0|p18;
我对Repexp模式无法做到的是区分以下内容:
\fArial Narrow|b0|i0|c0|p18;
和
\\\fArial Narrow|b0|i0|c0|p18;
前者控制格式,第二个只是以反向固体开头的文字字符串。
正如我在更一般的情况下看到的那样,我需要能够区分以偶数\
开头的字符串和奇数。为了说明如下,每个奇数行包含一个格式化控制字符串,每个偶数行都是一个文字字符串:
\fArial Narrow|b0|i0|c0|p18;
\\\fArial Narrow|b0|i0|c0|p18;
\\\\\fArial Narrow|b0|i0|c0|p18;
\\\\\\\fArial Narrow|b0|i0|c0|p18;
\\\\\\\\\fArial Narrow|b0|i0|c0|p18;
...
到目前为止,我对正则表达式模式的最佳尝试是:
(?:\\\\)*\\f[^;]+?\|[^;]+;
但它不起作用,因为第一组可能只是失败,它仍将始终匹配。我的想法是,第一组(?:\\\\)*+
的占有量词会解决问题,但当然vbscript regexp没有占有量词。
我很欣赏我正在尝试做的事情似乎是做作的,因为谁会以文字字符串的形式输入\\fArial Narrow|b0|i0|c0|p18;
?但我仍然想知道如何实现这一目标。
我有什么想法可以做到这一点吗?
答案 0 :(得分:2)
您的问题是,您没有任何东西可以匹配字符串之前的任何内容。如果你改变你的正则表达式(我相信这是正确的):
(^|\b)(?:\\\\)*\\f[^;]+?\|[^;]+;
你应该得到你需要的比赛; (^|\b)
匹配行的开头或单词边界。显然,如果您知道可能在您的模式之前的任何其他字符,也可以在此处添加。