tester - test regex javascript




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

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
}

J'ai un fichier au format suivant:

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

Je voudrais saisir les Data I want entre les balises [Start] et [End] utilisant un Regex. Quelqu'un peut-il me montrer comment cela pourrait être fait?


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)


Lire le texte entre crochets [] c'est-à-dire [Démarrer] 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;
}


$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 ...


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

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







parsing