Vă mulțumim pentru susținere

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

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

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

Aș dori să iau Data I want între tagurile [Start] și [End] folosind un Regex. Poate cineva să-mi arăt cum se poate face asta?

0
adăugat editat
Simplu la "RegEx pentru a obține text în etichete" -
adăugat autor Robinicks

13 răspunsuri

$ {\ rmS} _6 $ nu este grupul de automorfism al unui grup finit. Vezi H.K. Iyer, La rezolvarea ecuației Aut (X) = G , Rocky Mountain J. Math. 9 (1979), nr. 4, 653--670, disponibil online aici .

Această lucrare demonstrează că pentru orice grup finit $ G $, există foarte multe grupurile finite $ X $ cu $ {\ rm Aut} (X) = G $, și rezolvă în mod explicit ecuație pentru unele valori specifice de $ G $. În special, teorema 4.4 oferă soluția completă pentru $ G $ un grup simetric și când $ n = 6 $ nu există astfel de $ X $.

80
adăugat

Este, probabil, demn de spus

Belolipetsky, Mihail; Lubotzky,   Alexander. Grupuri finite și   hiperbolice multiple. Inventa. Math.   162 (2005), nr. 3, 459-472. MR2198218 .

unde se arată că pentru fiecare grup finit G există un grup infinit Gamma cu Out (Gamma) = G .

30
adăugat
Există un rezultat mai bun here pentru grupuri numărate.
adăugat autor Qiaochu Yuan

Pe de altă parte, $ {\ rmS} _6 $ este izomorf la $ {\ rm Sp} _4 (\ mathbb {F} _2) $, astfel încât acesta este un grup de auto-morfism într-o altă categorie (altele decât grupurile sau seturi). Acest automat este expus prin uitarea la 2 torsiune a lui Jacobian al unei curbe hyperelliptice H din genul 2 (dacă $ H $ este dat de $ y ^ 2 = f (x) $, cu $ f $ de gradul 6, apoi 15 puncte non-trivial două puncte de torsiune sunt dată [ca modul Galois] prin diferențele de rădăcini de $ f $; consultați pagina wiki pentru suprafața Kummer ).

15
adăugat
Vrei să spui Sp_4 (F_2), sunt sigur, SL_4 (F_2) este pur și simplu prea mare pentru a fi S_6.
adăugat autor Vladimir Dotsenko

There is a whole array of results, going back to G. Birkhoff at 1930s saying that every group is an automorphism group of some universal algebra (or some universal algebra inside some class).
(This really should be merely a comment to the previous answer, but I am still not reputable enough to leave comments).

6
adăugat
Între timp, aveți destule puncte pentru a comenta!
adăugat autor Stefan Kohl

Cu Perl puteți să înconjurați datele pe care le doriți cu () și să le trageți mai târziu, probabil că 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
}
0
adăugat
\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]

Acest lucru ar trebui să scadă, de asemenea, marcatorii [start] și [end] .

0
adăugat
Aspectul din față poate fi mai puțin eficient, dar îmi place cum l-ați împiedicat să se rupă dacă există un cod [start] sau [end] neașteptat. Este întotdeauna bine să te gândești la cazuri și să le preempti.
adăugat autor Alex W
\[start\](.*?)\[end\]

Zhich va pune textul în mijloc în cadrul unei capturi.

0
adăugat
Mult mai bine (mai simplu) decât răspunsul acceptat ... :-)
adăugat autor PhiLho
Aceasta încă nu va prinde șiruri de caractere care au pauze de linie
adăugat autor Doug
@ Utilizați opțiunea dorall. Nu este o problemă a regexului.
adăugat autor AlexR

Dacă garantați că fiecare etichetă de start este urmată de o etichetă de sfârșit, atunci ar funcționa următoarele.

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

Cu toate acestea, dacă aveți text complex, cum ar fi următoarele:

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

atunci ai avea probleme cu regex.

Acum, următorul exemplu va scoate toate legăturile fierbinți dintr-o pagină:

'//i'

În cazul de mai sus, putem garanta că nu vor exista cazuri imbricate de:

''

Deci, aceasta este o întrebare complexă și nu poate fi rezolvată doar printr-un răspuns simplu.

0
adăugat

O discuție mai completă despre capcanele utilizării unui regex pentru a găsi etichete potrivite poate fi găsită la: http: //faq.perl.org/perlfaq4.html#How_do_I_find_matchi . În special, trebuie să țineți cont de faptul că etichetele de cuibărit necesită un parser complet, pentru a fi interpretate corect.

Rețineți că sensibilitatea cazului va trebui dezactivată pentru a răspunde la întrebare, așa cum este menționat. În perl, acesta este modificatorul i :

$ 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 să utilizați cutivătorul *? care oprește lăcomia meciului capturat. De exemplu, dacă aveți o etichetă [end] care nu se potrivește:

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

probabil că nu doriți să capturați:

 Data i want [End] Data
0
adăugat

În timp ce puteți utiliza o expresie regulată pentru a analiza datele dintre etichetele de deschidere și de închidere, trebuie să vă gândiți mult și greu la întrebarea dacă aceasta este o cale pe care doriți să o schimbați. Motivul pentru care este potențialul etichetelor de a cuibări: dacă se pot întâmpla vreodată sau se pot întâmpla vreodată etichete de cuibărit, se spune că limba nu mai este regulată și expresiile regulate nu mai sunt instrumentul adecvat pentru o analiză.

Multe implementări de expresie regulată, cum ar fi expresiile regulate PCRE sau perl, susțin backtracking care pot fi folosite pentru a obține acest efect brut. Dar PCRE (spre deosebire de perl) nu suportă backtracking nelimitat și acest lucru poate cauza lucrurile să se spargă în moduri ciudate de îndată ce ai prea multe etichete.

Există o foarte frecvent citată postare pe blog care discută acest lucru mai mult, http://kore-nordmann.de/ blog / do_NOT_parse_using_regexp.html (Google pentru el și verificați cache-ul în prezent, par să aibă unele întreruperi)

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

I had a similar problem for a while & I can tell you this method works...

0
adăugat

Consultați această întrebare pentru a scoate textul între etichete cu caractere spațiu și puncte (. )

[\S\s] is the one I used

Regex pentru a potrivi orice caracter, inclusiv linii noi

0
adăugat

Reading the text with in the square brackets [] i.e.[Start] and [End] and validate the array with a list of values. 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
adăugat