Vra

Ek het'n lêer in die volgende formaat:

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

Ek wil graag aan te gryp die Data I want tussen die [Start] en [End] tags met behulp van'n Regex.Kan iemand my wys hoe dit gedoen kan word?

Was dit nuttig?

Oplossing

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

Dit behoort hopelik val die [start] en [end] merkers sowel.

Ander wenke

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

Zhich'll sit die teks in die middel binne 'n opname.

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

Ek het 'n soortgelyke probleem vir 'n rukkie en ek kan jou vertel hierdie metode werk ...

'n meer volledige bespreking van die slaggate van die gebruik van 'n regex om ooreenstem met etikette te vind kan gevind word by: http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi . In die besonder, daarvan bewus wees dat nes tags regtig nodig het 'n volwaardige parser om korrek geïnterpreteer.

Let daarop dat geval sensitiwiteit sal moet afgeskakel word ten einde die vraag te beantwoord soos gestel. In perl, dit is die i wysiger:

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

Die ander truuk is om te gebruik die *? kwantifiseerder wat afgeskakel die hebsug van die gevange wedstryd. Byvoorbeeld, as jy 'n nie-ooreenstemmende [end] tag:

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

jy waarskynlik nie wil hê om te vang:

 Data i want [End] Data

Terwyl jy 'n gewone uitdrukking kan gebruik om die data tussen die opening en sluiting tags ontleed, moet jy 'n lang en harde dink oor die vraag of dit 'n pad wat jy wil om af te gaan. Die rede daarvoor is die potensiaal van etikette om nes. As nes tags ooit kon gebeur of ooit kan gebeur, is die taal sê vir nie meer gereelde wees, en gereelde uitdrukkings ophou om die behoorlike instrument wees vir die ontleding van dit

Baie gewone uitdrukking implementering, soos PCRE of gereelde uitdrukkings perl se ondersteuning back tracking wat gebruik kan word om hierdie rowwe effek te bereik. Maar PCRE (in teenstelling met perl) ondersteun nie onbeperkte back tracking, en dit kan eintlik veroorsaak dinge te breek in vreemde maniere sodra jy te veel tags.

Daar is 'n baie algemeen aangehaal blog post wat hierdie meer bespreek, http: // Kore-Nordmann .de / blog / do_NOT_parse_using_regexp.html (google vir dit en maak seker die kas tans, hulle blyk te wees met 'n paar stilstand)

Wel, as jy verseker dat elke begin tag word gevolg deur 'n einde tag dan die volgende sal werk.

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

As jy egter het komplekse teks soos die follwoing:

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

dan sou jy in die moeilikheid met regex.

Nou die volgende voorbeeld sal alles in die warm skakels in 'n bladsy:

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

In die bogenoemde geval kan ons verseker dat daar nie sou wees enige sub-gevalle van:

'<a></a>'

So, dit is 'n komplekse vraag en kan nie net opgelos word met 'n eenvoudige antwoord.

Met Perl jy kan die data wat jy wil met (omring) se en trek dit uit later, miskien ander tale het 'n soortgelyke funksie.

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
}

Verwys na hierdie vraag te teks uit te trek tussen tags met ruimte karakters en kolle (.)

[\S\s] is die een wat ek gebruik

Regex om enige karakter aan te pas, insluitend nuwe lyne

Lees die teks in die vierkantige hakies [] d. w. s[Begin] en [Einde] en die geldigheid van die skikking met'n lys van waardes. 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;
}
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top