Regex: Pour sortir une sous-chaîne entre deux balises dans une chaîne

J'ai un fichier au format suivant:

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

Je voudrais saisir le Data je veux entre les balises [Démarrer] et [Fin] en utilisant un Regex. Quelqu'un peut-il me montrer comment cela pourrait être fait?

0
Similaire à "RegEx pour obtenir le texte dans les balises" - stackoverflow.com/questions/353309/…
ajouté l'auteur Robinicks, source

13 Réponses

$ {\ rm S} _6 $ n'est pas le groupe d'automorphisme d'un groupe fini. Voir H.K. Iyer, Sur la résolution de l'équation Aut (X) = G , Rocky Mountain J. Math. 9 (1979), no. 4, 653--670, disponible en ligne ici .

Cet article prouve que pour tout groupe fini $ G $, il y en a un nombre fini groupes finis $ X $ avec $ {\ rm Aut} (X) = G $, et il résout explicitement le équation pour certaines valeurs spécifiques de $ G $. En particulier, le théorème 4.4 donne la solution complète pour $ G $ un groupe symétrique, et quand $ n = 6 $, il n'y a pas de $ X $.

80
ajouté

Il vaut probablement la peine de pointer vers

Belolipetsky, Mikhail; Lubotzky,   Alexandre. Groupes finis et   variétés hyperboliques. Inventer. Math.   162 (2005), no. 3, 459-472. MR2198218 .

où il est montré que pour tout groupe fini G , il y a un groupe infini Gamma avec Out (Gamma) = G .

30
ajouté
Il y a un résultat plus fort Google & _acct = C000022659 & _version = 1 & _urlVersion = 0 & _userid = 501045 & md5 = 0c287de2112b97f650c0dd71c898359f "> ici sciencedirect.com/… ; pour les groupes dénombrables.
ajouté l'auteur Qiaochu Yuan, source

D'un autre côté, $ {\ rm S} _6 $ est isomorphe à $ {\ rm Sp} _4 (\ mathbb {F} _2) $, de sorte que c'est un groupe d'automorphismes dans une autre catégorie (autre que les groupes ou ensembles). Cet automorphisme est montré en regardant la 2-torsion de la Jacobien d'une courbe hyperelliptique H du genre 2 (si $ H $ est donné par $ y ^ 2 = f (x) $, avec $ f $ de degré 6, puis 15 points de torsion non triviaux donné [en module de Galois] par des différences de racines de $ f $; voir la page wiki pour la surface de Kummer ).

15
ajouté
Tu veux dire Sp_4 (F_2), j'en suis sûr, - SL_4 (F_2) est tout simplement trop gros pour être S_6.
ajouté l'auteur Vladimir Dotsenko, source

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
ajouté
En attendant vous avez assez de points pour commenter!
ajouté l'auteur Stefan Kohl, source

Avec Perl vous pouvez entourer les données que vous voulez avec() et les sortir plus tard, peut-être que d'autres langues ont une fonctionnalité similaire.

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
ajouté
\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]

Cela devrait, espérons-le, faire tomber les marqueurs [start] et [end] .

0
ajouté
Le look ahead peut être moins efficace mais j'aime comment vous l'avez empêché de casser s'il y a un [start] ou un [end] inattendu. Il est toujours bon de penser aux cas limites et de les préempter.
ajouté l'auteur Alex W, source
\[start\](.*?)\[end\]

Zhich'll mettre le texte au milieu d'une capture.

0
ajouté
Beaucoup mieux (plus simple) que la réponse acceptée ... :-)
ajouté l'auteur PhiLho, source
Cela n'attrape toujours pas les chaînes qui ont des sauts de ligne
ajouté l'auteur Doug, source
@Doug utilise l'option dotall. Pas un problème de regex.
ajouté l'auteur AlexR, source

Eh bien, si vous garantissez que chaque balise de début est suivie d'une balise de fin, alors ce qui suit fonctionnerait.

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

Cependant, si vous avez un texte complexe tel que le suivant:

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

alors vous auriez des problèmes avec regex.

Maintenant, l'exemple suivant va sortir tous les liens chauds dans une page:

'//i'

Dans le cas ci-dessus, nous pouvons garantir qu'il n'y aurait pas de cas imbriqués de:

''

Donc, c'est une question complexe et ne peut pas être résolu simplement avec une réponse simple.

0
ajouté

Une discussion plus complète sur les pièges de l'utilisation d'une regex pour trouver des balises correspondantes peut être trouvée à: http: //faq.perl.org/perlfaq4.html#How_do_I_find_matchi . En particulier, sachez que les balises d'imbrication ont vraiment besoin d'un analyseur à part entière pour être interprétées correctement.

Notez que la sensibilité à la casse devra être désactivée afin de répondre à la question comme indiqué. En perl, c'est le modificateur i :

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

L'autre astuce consiste à utiliser le quantificateur *? qui désactive la gourmandise du match capturé. Par exemple, si vous avez une balise [end] non correspondante:

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

vous ne voulez probablement pas capturer:

 Data i want [End] Data
0
ajouté

Bien que vous puissiez utiliser une expression régulière pour analyser les données entre les balises d'ouverture et de fermeture, vous devez réfléchir longuement à la question de savoir s'il s'agit d'un chemin que vous souhaitez parcourir. La raison en est le potentiel d'imbrication des balises: si des balises d'imbrication peuvent jamais arriver ou peuvent arriver, la langue n'est plus régulière et les expressions régulières cessent d'être l'outil approprié pour l'analyser.

De nombreuses implémentations d'expressions régulières, telles que PCRE ou les expressions régulières de Perl, prennent en charge le retour arrière qui peut être utilisé pour obtenir cet effet approximatif. Mais PCRE (contrairement à perl) ne supporte pas le backtracking illimité, et cela peut réellement faire que les choses se cassent bizarrement dès que vous avez trop de balises.

Il y a un article de blog très souvent cité qui en parle plus, http://kore-nordmann.de/ blog / do_NOT_parse_using_regexp.html (google pour cela et vérifiez le cache actuellement, ils semblent avoir des temps d'arrêt)

0
ajouté
$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
ajouté

Reportez-vous à cette question pour extraire le texte entre les balises avec des espaces et des points (. )

[\S\s] is the one I used

Regex correspondant à tous les caractères, y compris les nouvelles lignes

0
ajouté

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
ajouté