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

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

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

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

4.08.2008 13:47:10
Похоже на «RegEx для получения текста в тегах» - stackoverflow.com/questions/353309/…
Robinicks 9.12.2008 16:56:06
9 ОТВЕТОВ
РЕШЕНИЕ
\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]

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

23
18.09.2017 13:35:58
Взгляд в будущее может быть менее эффективным, но мне нравится, как вы предотвратили его поломку, если есть неожиданность [start]или [end]. Всегда хорошо думать о крайних случаях и опережать их.
Alex W 13.07.2015 21:08:33
\[start\](.*?)\[end\]

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

63
18.09.2017 13:36:20
Это все еще не поймает строки, у которых есть разрывы строк
Doug 19.04.2010 03:22:42
@Doug использовать опцию dotall. Не проблема регулярного выражения.
AlexR 12.09.2014 08:30:21
$text ="Data Data Data start Data i want end Data";
($content) = $text =~ m/ start (.*) end /;
print $content;

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

5
6.10.2012 16:52:08

Более полное обсуждение ловушек использования регулярных выражений для поиска подходящих тегов можно найти по адресу: 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
4
20.08.2008 19:14:19

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

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

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

4
15.09.2008 14:18:27

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

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

Однако, если у вас сложный текст, такой как следующий:

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

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

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

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

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

'<a></a>'

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

3
11.05.2009 20:08:30

С 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
}
1
12.10.2008 12:21:25

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

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

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

0
23.05.2017 11:46:54

Чтение текста с помощью квадратных скобок [], т. Е. [Start] и [End], и проверка массива списком значений. 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;
}
0
7.02.2016 00:38:48