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

голоса
42

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

Выбор данных
Данные
[Начало]
Данные я хочу
[Конец]
Данные

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

Задан 04/08/2008 в 14:47
источник пользователем
На других языках...                            


9 ответов

голоса
63
\[start\](.*?)\[end\]

Zhich'll поместить текст в середине внутри захвата.

Ответил 04/08/2008 в 14:52
источник пользователем

голоса
22

\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]

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

Ответил 04/08/2008 в 14:55
источник пользователем

голоса
5
$text ="Data Data Data start Data i want end Data";
($content) = $text =~ m/ start (.*) end /;
print $content;

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

Ответил 06/10/2012 в 17:52
источник пользователем

голоса
4

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

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

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

Ответил 15/09/2008 в 15:18
источник пользователем

голоса
4

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

Следует отметить , что чувствительность к регистру должны быть выключены, чтобы ответить на этот вопрос , как указано. В Perlом, это я Модификатор:

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

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

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

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

 Data i want [End] Data
Ответил 20/08/2008 в 20:14
источник пользователем

голоса
3

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

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

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

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

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

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

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

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

'<a></a>'

Таким образом, это сложный вопрос, и не может просто быть решена с помощью простого ответа.

Ответил 11/05/2009 в 21:08
источник пользователем

голоса
1

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

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
}
Ответил 04/08/2008 в 15:00
источник пользователем

голоса
0

Чтение текста с в квадратных скобках [] то есть [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;
}
Ответил 12/09/2014 в 09:26
источник пользователем

голоса
0

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

[\S\s] это один я

Regex чтобы соответствовать любому символу, включая новые линии

Ответил 28/08/2013 в 22:12
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more