正则表达式在一个句子中多次匹配特定模式

Regex to match a specific pattern multiple times within a sentence

我对由多个句子组成的乳胶文本文件有以下问题,例如

Aaa \cref{fig:1}. Bbb \cref{fig:2} bbb \cref{fig:3}. Ccc \cref{fig:4}. Ddd \cref{fig:5} ddd \cref{fig:6} ddd \cref{fig:7}.

我需要弄清楚的是如何隔离每个句子中的 \cref{fig:xxx} 部分。问题是正则表达式应该只考虑 \cref{fig:xxx} 出现不止一次 (>1) 的句子。

如果正则表达式可以从句子 bbb 中 return fig:2fig:3,以及 fig:5fig:6fig:7 来自句子 ddd.

我必须在 Textmate (texteditor) 中使用正则表达式进行搜索。

您需要的是积极的前瞻性陈述。例如:

\S*(?=\s*\cref{)

注意!我不确定如何在你的文本程序中输入转义 and/or 符号,所以只是为了通过双“\”清楚我的意思是 \ char 和 \s 是 space char,\S anti space。 to return 也是无花果,你需要引入不同的组。本指南可能会帮助您: http://www.rexegg.com/regex-lookarounds.html#compound

除了我的评论之外,您还可以想出一种递归方法。但是,查看文档,TextMate 似乎不支持递归。在这种情况下,您可以轻松地重复该模式一次(满足您对出现次数超过 一次 的句子的要求):

(?:\cref\{(fig:\d+)\})(?:[^.]+?(?:\cref\{(fig:\d+)\}))+

分解,这会查找 \cref{} 并捕获内部 fig:+ 数字,然后查找不是点的字符 ([^.]) 并重复第一个子模式.正如评论中已经提到的那样,您可能需要使用句子条件(例如,什么被视为句子 - 这是 [^.] 部分)。在 regex101.com.

上查看该方法的演示