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

时间:2016-02-11 12:01:59

标签: regex textmate

我的乳胶文本文件包含多个句子,例如

,我遇到以下问题
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返回fig:2fig:3,以及从fig:5fig:6fig:7返回,那么效果会很好句子ddd。

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

2 个答案:

答案 0 :(得分:1)

你需要的是一个积极的前瞻性陈述。例如:

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

请注意!我不确定如何在文本程序中输入转义符和/或符号,所以只需要用双“\”清楚我的意思是\ char和\ s是空格char,\ S anti space。 还要返回无花果,你需要引入不同的群体。本指南可能对您有所帮助: http://www.rexegg.com/regex-lookarounds.html#compound

答案 1 :(得分:1)

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

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

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