Regex: Pentru a scoate un sub-șir între două etichete într-un șir de caractere

voturi
42

Am un fișier în următorul format:

date
Date
[Start]
Date Vreau
[Sfârşit]
Date

Aș vrea să apuca Data I wantde între [Start]și [End]etichetele cu ajutorul regexp. Poate cineva sa- mi arate cum acest lucru ar putea fi făcut?

Întrebat 04/08/2008 la 14:47
sursa de către utilizator
În alte limbi...                            


9 răspunsuri

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

Zhich'll pune textul în mijloc într-o captură.

Publicat 04/08/2008 la 14:52
sursa de către utilizator

voturi
22

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

Acest lucru ar trebui să scadă sperăm că [start]și [end]markeri, de asemenea.

Publicat 04/08/2008 la 14:55
sursa de către utilizator

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

Am avut o problemă similară pentru un timp si eu pot să vă spun această metodă funcționează ...

Publicat 06/10/2012 la 17:52
sursa de către utilizator

voturi
4

În timp ce se poate utiliza o expresie regulată pentru a analiza datele între deschidere și închidere tag-uri, trebuie să se gândească mult și greu pentru a stabili daca aceasta este o cale pe care doriți să meargă în jos. Motivul pentru aceasta este potențialul de etichete la cuib: în cazul în care etichetele de cuiburi ar putea întâmpla vreodată sau se poate întâmpla vreodată, limba se spune să nu mai fie regulate și expresii regulate încetează să fie instrumentul adecvat pentru parsare-l.

Multe implementari de expresie regulate, cum ar fi pcre sau expresii regulate Perls, suport ocolișuri, care pot fi utilizate pentru a obține acest efect dur. Dar PCRE (spre deosebire de perl) nu are suport pentru backtracking nelimitat, iar acest lucru poate provoca de fapt, lucruri pentru a rupe în moduri ciudate, de îndată ce aveți prea multe etichete.

Există un post foarte frecvent citat blog care discută despre acest lucru mai mult, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (google pentru ea și verifica cache - ul în prezent, ele par a fi având o perioadă de nefuncționare)

Publicat 15/09/2008 la 15:18
sursa de către utilizator

voturi
4

O discuție mai completă a capcanele folosind un regex pentru a găsi etichete care se potrivesc pot fi găsite la: http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi . În special, să fie conștienți de faptul că etichetele de cuibărit au nevoie într - adevăr un parser cu drepturi depline pentru a fi interpretate corect.

Rețineți că sensibilitatea caz va trebui să fie oprit pentru a răspunde la întrebarea după cum se menționează. În perl, asta e i modificator:

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

Celălalt truc este de a utiliza *? Cuantificator care se stinge lacomia meciului capturat. De exemplu, dacă aveți un non-potrivire [end] tag - ul:

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

probabil că nu doriți să captureze:

 Data i want [End] Data
Publicat 20/08/2008 la 20:14
sursa de către utilizator

voturi
3

Ei bine, dacă vă garantează că fiecare etichetă de deschidere este urmat de o etichetă de capăt, atunci ar funcționa următoarele.

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

Cu toate acestea, dacă aveți un text complex, cum ar fi follwoing:

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

atunci ai o problemă cu regex.

Acum exemplul următor va scoate toate link-urile fierbinți într-o pagină:

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

În cazul de mai sus putem garanta că nu va fi nici un caz imbricate de:

'<a></a>'

Deci, aceasta este o întrebare complexă și nu pot fi rezolvate doar cu un răspuns simplu.

Publicat 11/05/2009 la 21:08
sursa de către utilizator

voturi
1

Cu Perl puteți înconjoare datele pe care doriți cu () e și scoateți-l mai târziu, probabil, alte limbi au o caracteristică similară.

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
}
Publicat 04/08/2008 la 15:00
sursa de către utilizator

voturi
0

Citind textul cu în paranteze pătrate [] adică [Start] și [End] și validați matrice cu o listă de valori. 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;
}
Publicat 12/09/2014 la 09:26
sursa de către utilizator

voturi
0

Consultați această întrebare pentru a scoate textul între tag - uri cu caractere de spațiu și punctele ( .)

[\S\s] este cea pe care am folosit

Regex pentru a se potrivi cu orice caracter, inclusiv noi linii

Publicat 28/08/2013 la 22:12
sursa de către utilizator

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