Regulært uttrykk: For å trekke ut en sub-streng mellom to lapper i en streng

stemmer
43

Jeg har en fil i følgende format:

data data
Data
[Start]
Dataene jeg ønsker
[Slutt]
Data

Jeg ønsker å ta tak i Data I wantfra mellom [Start]og [End]kodene ved hjelp av en Regex. Kan noen vise meg hvordan dette kan gjøres?

Publisert på 04/08/2008 klokken 13:47
kilden bruker
På andre språk...                            


9 svar

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

Zhich'll sette teksten i midten i en fangst.

Svarte 04/08/2008 kl. 13:52
kilden bruker

stemmer
23

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

Dette bør forhåpentligvis slippe [start]og [end]markører også.

Svarte 04/08/2008 kl. 13:55
kilden bruker

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

Jeg hadde et lignende problem for en stund, og jeg kan fortelle deg denne metoden fungerer ...

Svarte 06/10/2012 kl. 16:52
kilden bruker

stemmer
5

En mer fullstendig drøfting av fallgruvene ved bruk av en regex å finne matchende koder kan finnes på: http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi . Spesielt være oppmerksom på at hekke tags virkelig trenger en fullverdig parser for å bli tolket riktig.

Vær oppmerksom på at store og små bokstaver må være slått av for å svare på spørsmålet som er oppgitt. I perl, er at jeg modifier:

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

Det andre trikset er å bruke *? kvantifikator som slår av grådighet av den fangede kamp. For eksempel, hvis du har en ikke-samsvar [end] tag:

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

har du sannsynligvis ikke vil fange opp:

 Data i want [End] Data
Svarte 20/08/2008 kl. 19:14
kilden bruker

stemmer
4

Selv om du kan bruke et vanlig uttrykk for å analysere data mellom åpning og lukking koder, må du tenke lenge og hardt om hvorvidt dette er en vei du ønsker å gå ned. Grunnen til det er potensialet i kodene til reiret: hvis hekkende tags noensinne kunne skje eller kan aldri skje, er språket sies å ikke lenger være vanlig, og regulære uttrykk opphøre å være det riktige verktøyet for parsing det.

Mange vanlige uttrykk implementeringer, for eksempel PCRE eller perl sin regulære uttrykk, støtte tilbakesporing som kan brukes for å oppnå denne grove effekt. Men PCRE (i motsetning til perl) støtter ikke ubegrenset backtracking, og dette kan faktisk føre til ting å bryte i rare måter så snart du har for mange koder.

Det er en svært vanlig sitert blogginnlegg som diskuterer dette mer, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (google for det og sjekke cache for tiden, synes de å være å ha litt nedetid)

Svarte 15/09/2008 kl. 14:18
kilden bruker

stemmer
3

Vel, hvis du garantere at hver start tag er etterfulgt av en slutt tag deretter følgende ville fungere.

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

Men hvis du har kompleks tekst som follwoing:

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

så ville du får problemer med regex.

Nå følgende eksempel vil trekke ut alle de varme linker på en side:

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

I ovennevnte tilfelle kan vi garantere at det ikke ville være noen nestet tilfeller av:

'<a></a>'

Så dette er et komplekst spørsmål, og kan ikke bare løses med et enkelt svar.

Svarte 11/05/2009 kl. 20:08
kilden bruker

stemmer
1

Med Perl kan du omgir dataene du vil ha med () 's og trekk den ut senere, kanskje andre språk har en lignende funksjon.

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
}
Svarte 04/08/2008 kl. 14:00
kilden bruker

stemmer
0

Lese teksten med i hakeparenteser [] dvs [Start] og [End] og validere array med en liste over verdier. 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;
}
Svarte 12/09/2014 kl. 08:26
kilden bruker

stemmer
0

Referere til dette spørsmålet for å trekke ut tekst mellom tagger med mellomrom og prikker ( .)

[\S\s] er den jeg brukte

Regex for å matche alle tegn inkludert nye linjer

Svarte 28/08/2013 kl. 21:12
kilden bruker

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