Regex: wyciągnięcie podciągu między dwoma znacznikami w łańcuchu

Mam plik w następującym formacie:

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

Chciałbym pobrać Data I want pomiędzy znacznikami [Start] i [End] używając wyrażenia regularnego. Czy ktoś może mi pokazać, jak można to zrobić?

Author: Aditi Parikh, 2008-08-04

9 answers

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

To powinno również obniżyć markery [start] i [end].

 23
Author: Xenph Yan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-18 13:35:58
\[start\](.*?)\[end\]

Zhich umieści tekst w środku ujęcia.

 64
Author: Karl Seguin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-18 13:36:20
$text ="Data Data Data start Data i want end Data";
($content) = $text =~ m/ start (.*) end /;
print $content;

Miałem podobny problem przez jakiś czas i mogę powiedzieć, że ta metoda działa...

 6
Author: PhaZe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-06 16:52:08

Pełniejsze omówienie pułapek używania wyrażenia regularnego w celu znalezienia pasujących tagów można znaleźć na stronie: http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi . w szczególności należy pamiętać, że znaczniki zagnieżdżania naprawdę potrzebują pełnowartościowego parsera, aby mogły być poprawnie zinterpretowane.

Zauważ, że aby odpowiedzieć na zadane pytanie, należy wyłączyć rozróżnianie wielkości liter. W Perlu jest to modyfikator i :

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

Drugą sztuczką jest użycie *? kwantyfikator, który wyłącza chciwość przechwyconego meczu. Na przykład, jeśli masz niepasujący [end] tag:

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

Prawdopodobnie nie chcesz uchwycić:

 Data i want [End] Data
 5
Author: Jon Ericson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-20 19:14:19

Podczas gdy możesz użyć wyrażenia regularnego do analizy danych między znacznikami otwierania i zamykania, musisz długo i mocno zastanowić się, czy jest to ścieżka, którą chcesz przejść. Powodem tego jest potencjał tagów do zagnieżdżania się: jeśli zagnieżdżanie tagów może się kiedykolwiek zdarzyć lub może się zdarzyć, mówi się, że język nie jest już regularny, a wyrażenia regularne przestają być właściwym narzędziem do jego analizowania.

Wiele implementacji wyrażeń regularnych, takich jak wyrażenia regularne PCRE lub Perl, wsparcie backtracking, które można wykorzystać do osiągnięcia tego szorstkiego efektu. Ale PCRE (w przeciwieństwie do Perla) nie obsługuje nieograniczonego backtrackingu, a to może w rzeczywistości powodować pękanie rzeczy w dziwny sposób, gdy tylko masz zbyt wiele tagów.

Jest bardzo często cytowany wpis na blogu, który omawia to bardziej, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (google dla niego i sprawdzić pamięć podręczną obecnie, wydają się mieć pewne przestoje)

 4
Author: Daniel Papasian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 14:18:27

Cóż, jeśli zagwarantujesz, że po każdym znaczniku początku będzie następował znacznik końca, wtedy następujące czynności będą działać.

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

Jednak, jeśli masz złożony tekst, taki jak follwoing:

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

Wtedy napotkasz problemy z regex.

Teraz poniższy przykład wyciągnie wszystkie gorące linki na stronie:

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

W powyższym przypadku możemy zagwarantować, że nie będzie zagnieżdżonych przypadków:

'<a></a>'

Więc jest to skomplikowane pytanie i nie można go po prostu rozwiązać z prostą odpowiedzią.

 3
Author: un33k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-11 20:08:30

Z Perlem możesz otoczyć dane, które chcesz użyć () i wyciągnąć je później, być może inne języki mają podobną funkcję.

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
Author: Grant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-12 12:21:25

Zobacz to pytanie, aby wyciągnąć tekst między znacznikami ze spacjami i kropkami (.)

[\S\s] is the one I used

Regex, aby dopasować dowolny znak zawierający nowe linie

 0
Author: ankitkpd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:54

Odczyt tekstu w nawiasach kwadratowych [], tzn. [Start] i [End] i Walidacja tablicy listą wartości. 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
Author: N Murali Mohan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-07 00:38:48