Regex: чтобы вытянуть подстроку между двумя тегами в строке

У меня есть файл в следующем формате:

Данные Данные
Данные
[Начинать]
Данные, которые я хочу
[Конец]
Данные

Я хотел бы, чтобы захватить Data I want с между [Start] и [End] тегами с помощью Regex. Может ли кто-нибудь показать мне, как это можно сделать?

Ответов (9)

Решение
\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]

Это следует надеяться , опускать [start] и [end] маркер , а также.

\[start\](.*?)\[end\]

Жич поместит текст посередине в кадре.

$text ="Data Data Data start Data i want end Data";
($content) = $text =~ m/ start (.*) end /;
print $content;

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

Прочтите текст, заключенный в квадратные скобки [], т.е. [Начало] и [Конец], и проверьте массив со списком значений. jsfiddle http://jsfiddle.net/muralinarisetty/r4s4wxj4/1/

var mergeFields = ["[sitename]",
                   "[daystoholdquote]",
                   "[expires]",
                   "[firstname]",
                   "[lastname]",
                   "[sitephonenumber]",
                   "[hoh_firstname]",
                   "[hoh_lastname]"];       

var str = "fee [sitename] [firstname] \
sdfasd [lastname] ";
var res = validateMeargeFileds(str);
console.log(res);

function validateMeargeFileds(input) {
    var re = /\[\w+]/ig;
    var isValid;
    var myArray = input.match(re);

    try{
        if (myArray.length > 0) {
            myArray.forEach(function (field) {

                isValid = isMergeField(field);

                if (!isValid){
                   throw e;                        
                }
            });
        }
    }
    catch(e) {        
    }

    return isValid;
}

function isMergeField(mergefield) {
    return mergeFields.indexOf(mergefield.toLowerCase()) > -1;
}

С Perl вы можете заключить нужные данные в скобки () и вытащить их позже, возможно, в других языках есть похожая функция.

if ($s_output =~ /(data data data data START(data data data)END (data data)/) 
{
    $dataAllOfIt = $1;      # 1 full string
    $dataInMiddle = $2;     # 2 Middle Data
    $dataAtEnd = $3;        # 3 End Data
}

Более полное обсуждение подводных камней использования регулярного выражения для поиска совпадающих тегов можно найти по адресу: http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi . В частности, имейте в виду, что вложенные теги действительно нуждаются в полноценном синтаксическом анализаторе для правильной интерпретации.

Обратите внимание, что для ответа на поставленный вопрос необходимо отключить чувствительность к регистру. В perl это модификатор i :

$ echo "Data Data Data [Start] Data i want [End] Data" \
  | perl -ne '/\[start\](.*?)\[end\]/i; print "$1\n"'
 Data i want 

Другой трюк - использовать *? квантификатор, который отключает жадность захваченного совпадения. Например, если у вас есть несовпадающий тег [end] :

Data Data [Start] Data i want [End] Data [end]

вы, вероятно, не хотите захватывать:

 Data i want [End] Data

Хотя вы можете использовать регулярное выражение для анализа данных между открывающими и закрывающими тегами, вам нужно долго и хорошо подумать, следует ли идти по этому пути. Причиной этого является возможность вложения тегов: если вложение тегов когда-либо могло произойти или может когда-либо произойти, говорят, что язык больше не является регулярным, и регулярные выражения перестают быть подходящим инструментом для его анализа.

Многие реализации регулярных выражений, такие как PCRE или регулярные выражения Perl, поддерживают отслеживание с возвратом, которое можно использовать для достижения такого грубого эффекта. Но PCRE (в отличие от Perl) не поддерживает неограниченный возврат с возвратом, и это может привести к тому, что что-то сломается странным образом, как только у вас будет слишком много тегов.

Есть очень часто цитируемое сообщение в блоге, в котором обсуждается это больше, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (Google для этого и проверьте кеш в настоящее время, у них, похоже, есть некоторое время простоя)

Что ж, если вы гарантируете, что за каждым начальным тегом следует конечный тег, то следующее будет работать.

\[start\](.*?)\[end\]

Однако, если у вас сложный текст, например:

[start] sometext [start] sometext2 [end] sometext [end]

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

Теперь в следующем примере будут извлечены все горячие ссылки на странице:

'/<a(.*?)a>/i'

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

'<a></a>'

Итак, это сложный вопрос, и на него нельзя просто ответить простым ответом.

Обратитесь к этому вопросу, чтобы выделить текст между тегами с пробелами и точками ( . )

[\S\s] это тот, который я использовал

Регулярное выражение для соответствия любому символу, включая новые строки