Arhn - архитектура программирования

Использование регулярного выражения для сопоставления строки между двумя строками

Как я могу использовать регулярное выражение для сопоставления текста, который находится между двумя строками, где эти две строки сами заключены в две другие строки, с любым количеством текста между внутренней и внешней строками?

Например, у меня есть этот текст:

внешнее начало некоторый текст внутреннее начало текст, который я хочу внутренний конец еще немного текста < strong>внешний конец

В данном случае мне нужен текст, который я хочу, потому что он находится между внутренним началом и внутренним концом, которые сами находятся между внешнее-начало и внешнее-конец.

Если у меня есть

некоторый текст внутреннее начало текст, который я хочу внутренний конец еще немного текста внешний конец

то мне не нужен текст, который я хочу, потому что, хотя он находится между внутренним началом и внутренним концом, есть эти строки не заключены в outer-start.

Аналогично, если у меня

внешнее начало какой-то текст текст, который я хочу внутренний конец еще немного текста внешний конец

опять же, мне не нужен текст, который я хочу, потому что нет вмещающего inner-start, хотя есть вмещающий outer-start< /strong> и внешний конец строки.

Предположим, что outer-start, inner-start, inner-end и outer-end будут использоваться только для целей включения / разграничения.

Я думаю, что могу сделать это, выполнив двухпроходное сопоставление регулярного выражения, т. е. поиск любых данных между outer-start и outer-end, а затем внутри этих данных поиск для любого текста между inner-start и inner-end (если эти строки действительно существуют), но я хотел бы знать, можно ли это сделать за один раз.


  • Реальные примеры вместо этих заполнителей внешнего начала, вероятно, дадут вам лучший ответ. 02.01.2010

Ответы:


1
/outer-start.*?inner-start(.*?)inner-end.*?outer-end/

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

"внешнее-начало какой-то текст внутреннее-начало первый-текст-который-я-хочу внутренний-конец еще немного текста внешний-конец внешнее-начало какой-то текст внутреннее-начало второй-текст-который-я-хочу внутренний-конец еще немного текста внешний конец"

Без минимального совпадения вы получите загадочное одиночное совпадение «второй-текст-который-я-хочу».

.*? означает «съесть ноль или более символов, но только столько, сколько вам нужно, чтобы остальная часть выражения совпадала. С ?» механизм регулярных выражений будет потреблять столько символов, сколько он может, пока остальная часть выражения совпадает.

02.01.2010
  • На самом деле, при жадном сопоставлении вы получите первый текст, который я хочу, внутренний конец, еще немного текста, внешний конец, внешнее начало, некоторый текст, внутреннее начало, второй текст, который я хочу, в группа захвата. 02.01.2010
  • Михал: Нет, первый (и не сгруппированный) .* съедает большую часть цитируемого вами текста. 02.01.2010
  • Ой... верно. Моя ошибка, спасибо за исправление. На самом деле, это веская причина, чтобы удалить мой ответ и +1 к этому. 02.01.2010
  • @Wayne: Почему бы вам не отредактировать, чтобы включить ленивую версию (.*?) В шаблон вверху? Судя по вашему ответу, у вас есть хорошее объяснение, почему .*? предпочтительнее, чем .*, но используйте .* в примере с высокой видимостью. :-) 02.01.2010
  • @Michael: О, это было неосторожно с моей стороны. Я проверил как хорошее, так и плохое регулярное выражение, но когда я опубликовал ответ, я скопировал и вставил плохое. Плохой программатор, куки нет! Спасибо, что присматриваешь за моей спиной. 02.01.2010
  • Конечно, по крайней мере, я могу дать себе крошечное печенье за ​​это. Вы по-прежнему получаете восхитительный звук для ленивого сопоставления фу. ;-) 02.01.2010
  • Уэйн, большое спасибо за ответ. На самом деле у меня есть следующий вопрос: есть ли способ проверить, что [текст между внешним и внутренним началом] не содержит определенной строки? т. е. я хочу вернуть совпадение только в том случае, если эта конкретная строка не найдена между внешним и внутренним началом. Я могу открыть новый вопрос, если вы думаете, что это сложно... 02.01.2010
  • @Shoko: В общем, просто замените .*? между внешним и внутренним началом шаблоном, который исключит конкретную строку, которую вы хотите исключить. Это может быть сложно или нет, в зависимости от рассматриваемой строки. Если сомневаетесь, задайте отдельный вопрос. 03.01.2010

  • 2

    Я предполагаю, что вы можете сделать что-то вроде:

    
    outer-start .*? inner-start (.*?) inner-end .*? outer-end
    
    02.01.2010
  • Похоже, Брайан опередил меня, опубликовав это решение. Причина, по которой я включил вопросительные знаки, заключалась в том, чтобы избавить вас от проблем с жадным регулярным выражением. Вы, вероятно, захотите включить их. 02.01.2010
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..


    © 2024 arhn.ru, Arhn - архитектура программирования