查找 << 和 >> 之间包含反斜杠的字符串

Find strings between << and >> that contain backslashes

我在一个 RTF 文件中工作,我必须在其中插入使用程序用数据替换的自定义标记语言的标签。例如,在文件中,我有:

Account number:  <<@Account.AccountNumber>>

我正在 Microsoft Word 2007 中编辑此模板,每当我退格时,Microsoft word 都会在模板中插入一堆 RTF 垃圾,所以我得到如下内容:

<<@Am\hich\af1\dbch\af31505\loch\f1 ount>>

而不是:

<<@Amount>>

如何找到发生这种情况的位置?我试着写正则表达式来做到这一点,但我不知道如何写得很好。这是我试过的一个:

<<.+?\.+?>>

但是当我传入这个短语时:

<<Where: Phrase =\ @Value>>\<<hi>>\hi<<hi>> 

“=”后面的反斜杠应该匹配,但是“<>”和“<>”标签之间的反斜杠和“<>" 标签应该匹配(regex101.com 和 Notepad++ 匹配它们)。

我不在乎是只有反斜杠本身匹配,还是整个带有反斜杠的标签都匹配。我的最终目标只是能够在 Notepad++(或其他必要的编辑器)中快速找到它们,以便我可以修复它们。

您可以使用以下正则表达式:

<<[^\>]*\[^>]*>>

Demo

解释:

  • <<自定义标记语言的开始标签
  • [^\>]* 不属于 \>
  • 的任意数量的字符
  • \ 文字 \
  • [^\>]* 不属于 >
  • 的任意数量的字符
  • >>自定义标记语言的结束标记

EDIT: 匹配即使 > 字符可以在自定义标记标签内,您可以使用以下表达式,它依赖于原子组/所有格防止灾难性回溯并保持快速匹配的量词:

<<(?>(?>[^\>]*)(?>>(?!>))?)*+\(?>(?>[^>]*)(?>>(?!>))?)++>>

它与前面的表达式类似,但包括:

  • (?>...)个原子团
  • (?>>(?!>))? 可选地匹配 > 如果没有紧跟另一个 >
  • *+ 任意次数 + 所有格量词
  • ++ 至少一次 + 所有格量词

Demo