2016-02-11 4 views
2

У меня есть следующая проблема с текстовым файлом латекса, который состоит из нескольких предложений, например.Regex, чтобы соответствовать определенному шаблону несколько раз в предложении

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).

Хороший результат будет, если регулярное выражение может возвращать fig:2 и fig:3 из предложения ГЭБ, а также fig:5, fig:6 и fig:7 из предложения ДДД.

Я должен использовать регулярные выражения для поиска в Textmate (texteditor).

+0

Проблема в том, как определено предложение - заканчивается ли она точкой? Что это должно делать с другими точками (например, например)? Оканчивается ли она символом новой строки? Что касается вашей второй части, вы можете создать регулярное выражение, например ['\\ cref {(fig: \ d +)}'] (https://regex101.com/r/qN3iP9/1) – Jan

+0

Да, я вижу. .. Может ли это помочь, если начало предложения будет идентифицироваться точкой, а затем пробелом и начинается с прописного альпаномерного значения. Что-то вроде '\. \ S + [A-Z0-9]'. Конец предложения может быть идентифицирован точкой и некоторым пробелом '\. \ S +'. Я знаю, что это сложно, мне совершенно не хватает навыков для этого ... – hetsch

+0

Вы можете использовать рекурсивный подход, см. [Обновленное демо] (https://regex101.com/r/qN3iP9/2), оно соответствует только предложение bbb, ddd и eee (я сделал это). Однако окончание предложения должно быть четким (er). – Jan

ответ

1

В дополнение к моему комментарию вы можете найти рекурсивный подход. Однако, глядя на документацию, рекурсия, похоже, не поддерживается в TextMate. В этом случае, вы можете легко повторить рисунок на еще один раз (удовлетворяющего ваши требования предложений с более чем один встречаемости):

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

Сломался, это выглядит для \\cref{} и захватывает внутреннюю fig: + цифры, затем ищет символ, который не является точкой ([^.]) и повторяет первый подшаблон. Как уже упоминалось в комментариях, вам, вероятно, придется поиграть с условиями предложения (например, то, что считается предложением - это часть [^.]). См. Демонстрацию подхода на regex101.com.

+0

Благодарим вас за вашу помощь, это должно помочь мне! – hetsch

+0

@hetsch: Не стоит беспокоиться, удачи. – Jan

1

что вам нужно, это положительное выражение. например:

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

примечание! Я не уверен, как вводить escapes и/или символы в вашей текстовой программе, чтобы просто быть понятным двойным «\». Я имею в виду, что \ char и \ s - это пробел char, \ S anti space. , чтобы вернуть также рис, вам нужно будет ввести разные группы. это руководство может помочь вам: http://www.rexegg.com/regex-lookarounds.html#compound

 Смежные вопросы

  • Нет связанных вопросов^_^