Regex: Aby wyciągnąć podnapis pomiędzy dwoma tagami w sznurku

głosy
42

Mam plik w następującym formacie:

dane dane
Dane
[Początek]
Dane chcę
[Koniec]
Dane

Chciałbym chwycić Data I wantspomiędzy [Start]i [End]tagów za pomocą regex. Czy ktoś może mi pokazać, w jaki sposób można tego dokonać?

Utwórz 04/08/2008 o 14:47
źródło użytkownik
W innych językach...                            


9 odpowiedzi

głosy
63
\[start\](.*?)\[end\]

Zhich'll umieścić tekst w środku ciągu przechwytywania.

Odpowiedział 04/08/2008 o 14:52
źródło użytkownik

głosy
22

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

To powinno nadzieją upuść [start]i [end]markerów, jak również.

Odpowiedział 04/08/2008 o 14:55
źródło użytkownik

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

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

Odpowiedział 06/10/2012 o 17:52
źródło użytkownik

głosy
4

Chociaż można użyć wyrażenia regularnego do analizowania danych pomiędzy otwierających i zamykających znaczników, trzeba myśleć długo i ciężko o tym, czy jest to ścieżka chcesz iść w dół. Powodem tego jest potencjał tagów zagnieździć: jeśli zagnieżdżanie znaczników może kiedykolwiek zdarzyć lub może się wydarzyć, językiem mówi się już nie być regularne i wyrażenia regularne przestanie być właściwym narzędziem do analizowania go.

Wiele implementacji wyrażeń regularnych, jak PCRE lub wyrażeń regularnych Perl, wsparcie backtracking które mogą być wykorzystane, aby osiągnąć ten efekt. Szorstką Ale PCRE (w przeciwieństwie Perl) nie obsługuje nieograniczoną Backtracking, a to może faktycznie powodować rzeczy złamać w dziwnych sposobów, jak tylko masz zbyt wiele tagów.

Jest to bardzo powszechnie cytowane blogu, który omawia to więcej, 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)

Odpowiedział 15/09/2008 o 15:18
źródło użytkownik

głosy
4

Pełniejsze omówienie pułapek przy użyciu regex znaleźć 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 zagnieżdżanie znaczników naprawdę trzeba się pełnoprawnym parser, aby być interpretowane poprawnie.

Należy pamiętać, że czułość sprawa będzie musiała być wyłączona w celu udzielenia odpowiedzi na pytanie, jak zaznaczono. W Perl, że to ja modyfikator:

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

Druga sztuczka polega na użyciu ? * kwantyfikator który wyłącza greediness przechwyconego meczu. Na przykład, jeśli masz non-dopasowanie [koniec] tag:

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

pewnie nie chce się uchwycić:

 Data i want [End] Data
Odpowiedział 20/08/2008 o 20:14
źródło użytkownik

głosy
3

Cóż, jeśli gwarantuje, że każdy tag początek następuje znacznika końcowego następnie dodaje się uda.

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

Jednakże, jeśli masz złożonych tekstach takich jak follwoing:

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

to byś napotkasz problemy z regex.

Teraz następujący przykład będzie wyciągnąć wszystkie gorące linki na stronie:

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

W powyższym przypadku możemy zagwarantować, że nie będzie żadnych zagnieżdżonych przypadki:

'<a></a>'

Tak, jest to złożony problem i nie może być rozwiązany tylko z prostych odpowiedzi.

Odpowiedział 11/05/2009 o 21:08
źródło użytkownik

głosy
1

Z Perl można otoczyć dane, które chcesz z () 's i wyciągnąć go 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
}
Odpowiedział 04/08/2008 o 15:00
źródło użytkownik

głosy
0

Czytanie tekstu ze w nawiasach kwadratowych [], czyli [Start] i [End] i potwierdzić tablicę z listy 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;
}
Odpowiedział 12/09/2014 o 09:26
źródło użytkownik

głosy
0

Odnieść się do tej kwestii, aby wyciągnąć tekst między znaczniki z spacji i kropek ( .)

[\S\s] Jest to jeden Użyłem

Regex dopasować dowolny znak w tym nowych linii

Odpowiedział 28/08/2013 o 22:12
źródło użytkownik

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