Regex: зацепка не сопровождается '---' - PullRequest
3 голосов
/ 27 января 2020

Вот небольшой текст, который выглядит как restructuredText.

This is a sentence to catch.

Title that should not be caught
-------------------------------

Another sentence to catch.

Я хочу регулярное выражение, которое ловит две строки, которые не являются заголовками, и оставляет предложение, которое является заголовком.

  1. Тест № 1: Как выйти из строки ---. Я сделал /^(?!(---))[^\n]+/gm. Это оставляет строку под заголовком. Это дает мне:
This is a sentence to catch.
Title that should not be caught
Another sentence to catch.
Тест № 2: Как оставить также предложение над заголовком строки (Title that should not be caught)? Я попытался /^(?!(---))[^\n]+(?!\n---)/gm, и это дало мне:
This is a sentence to catch.
Title that should not be caught
Another sentence to catch.

Проблема в том, что он не поймал письмо до \n---, тогда как то, что я хочу, не ловит все предложение до . То, что я хочу:

This is a sentence to catch.
Another sentence to catch.

Как мне поступить?

РЕДАКТИРОВАТЬ:

Спасибо за ваш ответ, который работает хорошо (я Я не уверен, что понимаю все, но я буду медитировать на этом ...).

Если вы согласны, давайте расширим проблему с дополнительной сложностью. Пример новой игрушки:

This is another title not to catch, Ha !
========================================

This is a sentence to catch.

Title that should not be caught
-------------------------------

Another sentence to catch.

Как видите, я добавил еще один тип заголовка с линией ===. С помощью регулярного выражения Тана я получаю:

=======
This is a sentence to catch.
Another sentence to catch.
  1. Тест 1bis: Я тестировал .+(?![\w\s\n-=]+).+, но ничего не поймано: (

Только для информации, я Я реализую что-то с Parsimonious на python.

Ответы [ 3 ]

1 голос
/ 28 января 2020

Если вы хотите сопоставить отдельные строки из данных примера, один из вариантов может заключаться в том, чтобы первая совпадающая строка не начиналась с --- или ===.

После сопоставления в первой строке укажите конец строки $ и используйте другой отрицательный прогноз, утверждая, что строка после этой строки также не начинается ни с ---, ни с ===

^(?!(?:---|===)).+$(?!\r?\n(?:---|===))
  • ^ Начало строки
  • (?! Отрицательный взгляд вперед, утверждайте, что прямо справа не является
    • (?:---|===) Соответствует либо ---, либо ===
  • ) Закрыть заголовок
  • .+$ Совпадение 1+ раз с любым символом, кроме новой строки и подтверждения конца строки
  • (?!\r?\n(?:---|===)) Еще один просмотр в качестве первого с новой строкой prepended

Regex demo | Python демо

1 голос
/ 27 января 2020

Вы можете попробовать использовать этот шаблон с вашим языком программирования: .+(?![\w\s\n-]+).+

Это пример использования языка javascript (на вашем основном языке вам не нужно менять шаблон):

var input = 
`This is a sentence to catch.

Title that should not be caught
-------------------------------

Another sentence to catch.`;

console.log(input.match(/.+(?![\w\s\n-]+).+/g))
0 голосов
/ 27 января 2020

Если вы используете linux (в частности, Ubuntu), вы можете попробовать это:

Этот тест был выполнен в Ubuntu, я не тестировал его в других дистрибутивах

line_match=$(grep -nrE '^(------)+.*$' my_file | grep -oE '[0-9]+') && line_to_delect="$(($line_match-1))" && sed ${line_to_delect},${line_match}d my_file

...