parsing - Regex: pour retirer un sous

Translate

J'ai un fichier au format suivant:

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

Je voudrais attraper leData I wantentre le[Start]et[End]balises utilisant une expression régulière. Quelqu'un peut-il me montrer comment cela pourrait être fait?

This question and all comments follow the "Attribution Required."

Toutes les réponses

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

J'espère que cela devrait faire tomber[start]et[end]marqueurs aussi.

La source
Translate
\[start\](.*?)\[end\]

Zhich mettra le texte au milieu d'une capture.

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

J'ai eu un problème similaire pendant un moment et je peux vous dire que cette méthode fonctionne ...

La source
Translate

Une discussion plus complète sur les pièges de l'utilisation d'une expression régulière pour trouver des balises correspondantes peut être trouvée sur: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 leimodificateur:

$ 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 non-correspondance[fin]marque:

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

vous ne voulez probablement pas capturer:

 Data i want [End] Data
La source
Translate

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 et sérieusement à savoir s'il s'agit d'un chemin que vous souhaitez emprunter. La raison en est le potentiel des balises à imbriquer: si l'imbrication des balises peut se produire ou se produire, le langage n'est plus régulier 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 grossier. Mais PCRE (contrairement à perl) ne prend pas en charge le retour en arrière illimité, et cela peut en fait provoquer des pannes étranges dès que vous avez trop de balises.

Il y a un article de blog très fréquemment cité qui en discute davantage,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)

La source
Translate

Eh bien, si vous garantissez que chaque balise de début est suivie d'une balise de fin, 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 rencontreriez des problèmes avec regex.

Maintenant, l'exemple suivant va extraire tous les liens actifs d'une page:

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

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

'<a></a>'

C'est donc une question complexe et ne peut pas être résolue simplement avec une réponse simple.

La source
Translate

Avec Perl, vous pouvez entourer les données que vous voulez de () et les extraire plus tard, peut-être que d'autres langages 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
}
La source
Translate

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

[\S\s]est celui que j'ai utilisé

Regex pour correspondre à n'importe quel caractère, y compris les nouvelles lignes

La source
Translate

Lire le texte entre crochets [] ie [Début] et [Fin] et valider le tableau avec une liste de valeurs.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;
}
La source