Регулярное выражение между двумя символами и несколькими строками - PullRequest
2 голосов
/ 14 января 2020

У меня есть эта строка здесь:

-Node: song
--Tag: ItsyWitsySpider
---lyrics: The itsy witty spider climbed up the waterspout.
       Down came the rain,
       and washed the spider out
--Tag: BaBaBlackSheep
---lyrics: Baa, baa, black sheep, have you any wool?
       Yes sir, yes sir, three bags full!
       One for the master,
       And one for the dame,
--Tag:IfYoureHappyAndYouKnowIt
...

Я хочу получить все

       The itsy witty spider climbed up the waterspout.
       Down came the rain,
       and washed the spider out

С помощью регулярных выражений. На данный момент мое лучшее регулярное выражение:

(?<=ItsyWitsySpider\n)(?:_*lyrics: ).*?(?=_)

Пример здесь: https://regex101.com/r/3myZwB/1 не похоже на работу Спасибо за любую помощь

Ответы [ 3 ]

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

Ваш текст содержит дефисы -, но ваше регулярное выражение ищет подчеркивания _. Ваше регулярное выражение должно быть

(?<=ItsyWitsySpider\n)(?:-*lyrics: ).*?(?=-)

, хотя гораздо более быстрое регулярное выражение будет

(?<=ItsyWitsySpider\n)(?:_*lyrics: )[^-]*
1 голос
/ 14 января 2020
/The itsy.*([\r\n].*)*out/gm

let re = /The itsy.*([\r\n].*)*out/gm
let str = `
      -Node: song
      --Tag: ItsyWitsySpider
      ---lyrics: The itsy witty spider climbed up the waterspout.
             Down came the rain,
             and washed the spider out
      --Tag: BaBaBlackSheep
      ---lyrics: Baa, baa, black sheep, have you any wool?
             Yes sir, yes sir, three bags full!
             One for the master,
             And one for the dame,
      --Tag:IfYoureHappyAndYouKnowIt
...
`

console.log(str.match(re))
1 голос
/ 14 января 2020

Вы можете расширить вид сзади и убедиться, что он соответствует гипсу после новой строки:

(?<=ItsyWitsySpider\n---lyrics: ).*?(?=\r?\n-)

Пояснение

  • (?<= Положительный вид сзади, подтвердите, что слева это
    • ItsyWitsySpider\n---lyrics: Соответствует ItsyWitsySpider, переводу строки и ---lyrics:
  • ) Закрыть положительный взгляд за
  • .*? Соответствует любому символу, кроме новой строки без жадности
  • (?= Позитивный прогноз, утверждают, что слева есть
    • \r?\n- Соответствует новой строке, затем соответствует -
  • ) Закрыть взгляд

Regex demo


Или вы можете использовать группу захвата вместо посмотрим сзади, что будет немного более эффективным, если вы сможете сопоставить все строки, которые не начинаются с --Tag.

ItsyWitsySpider\r?\n---lyrics: (.*(?:\r?\n(?!--Tag).*)*)\r?\n--Tag

по частям

  • ItsyWitsySpider\r?\n---lyrics: Match ItsyWitsySpider до lyrics:
  • ( Захват группа 1
    • .* Совпадение с любым символом кроме символа новой строки 0+ раз
    • (?: Не капту группа звонков
      • \r?\n(?!--Tag) Соответствует новой строке и утверждает, что следующая строка не начинается с --Tag
      • .* Соответствует любому символу, кроме новой строки 0+ раз
    • )* Закрыть группу с повторением 0+ раз
  • ) Закрыть группу 1
  • \r?\n--Tag Совпадение с новой строкой, за которым следует --Tag

Regex demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...