Сведения о вопросе

Математик

16:03, 1st July, 2020

Теги

regex   parsing    

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

Просмотров: 482   Ответов: 9

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

Data Data
Data
[Start]
Data I want
[End]
Data

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



  Сведения об ответе

LIZA

18:03, 1st July, 2020

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

Жич поставит текст посередине в пределах захвата.


  Сведения об ответе

screen

18:03, 1st July, 2020

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

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


  Сведения об ответе

ЯЯ__4

18:03, 1st July, 2020

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

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


  Сведения об ответе

fo_I_K

18:03, 1st July, 2020

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


  Сведения об ответе

davran

18:03, 1st July, 2020

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

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

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


  Сведения об ответе

P_S_S

18:03, 1st July, 2020

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

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

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

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

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

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

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

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

'<a></a>'

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


  Сведения об ответе

9090

18:03, 1st July, 2020

С помощью 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
}


  Сведения об ответе

$DOLLAR

18:03, 1st July, 2020

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

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

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


  Сведения об ответе

ITSME

18:03, 1st July, 2020

Прочтите текст с помощью квадратных скобок [] i.e.[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;
}


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться