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

voix
42

J'ai un fichier dans le format suivant:

Les données de données
Les données
[Début]
Je veux des données
[Fin]
Les données

Je voudrais saisir l' Data I wantd'entre les [Start]et [End]balises à l' aide d' une expression rationnelle. Quelqu'un peut -il me montrer comment cela pourrait se faire?

Créé 04/08/2008 à 14:47
source utilisateur
Dans d'autres langues...                            


9 réponses

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

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

Créé 04/08/2008 à 14:52
source utilisateur

voix
22

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

Cela devrait , espérons laisser tomber le [start]et [end]marqueurs ainsi.

Créé 04/08/2008 à 14:55
source utilisateur

voix
5
$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 certain temps et je peux vous dire que cette méthode fonctionne ...

Créé 06/10/2012 à 17:52
source utilisateur

voix
4

Alors que vous pouvez utiliser une expression régulière pour analyser les données entre les balises d'ouverture et de fermeture, vous devez penser à long et difficile de savoir si c'est un chemin que vous voulez aller vers le bas. La raison en est le potentiel des balises pour nicher: si les balises de nidification pourraient jamais se produire ou ne jamais arriver, la langue est dit ne plus être des expressions régulières, régulières et cesser d'être l'outil approprié pour l'analyser.

De nombreuses implémentations d'expression régulière, comme PCRE ou des expressions régulières de Perl, support retours en arrière qui peut être utilisé pour obtenir cet effet brut. Mais PCRE (contrairement perl) ne supporte pas les retours en arrière illimitée, et cela peut effectivement causer des choses à briser de manière étrange, dès que vous avez trop de balises.

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

Créé 15/09/2008 à 15:18
source utilisateur

voix
4

Une discussion plus complète des pièges de l' utilisation d' une expression rationnelle pour trouver des balises correspondant peut être trouvé à l' adresse: http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi . En particulier, il faut savoir que les balises de nidification ont vraiment besoin d' un analyseur à part entière afin d'interpréter correctement.

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

$ 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 *? quantificateurs qui désactive l'avidité du match capturé. Par exemple, si vous avez un non-appariement [fin] tag:

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

vous ne voulez probablement pas capturer:

 Data i want [End] Data
Créé 20/08/2008 à 20:14
source utilisateur

voix
3

Eh bien, si vous garantissez que chaque balise de début est suivie d'une balise de fin, puis la suivante fonctionnerait.

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

Toutefois, si vous avez un texte complexe, comme le follwoing:

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

alors vous rencontrez des problèmes avec regex.

Maintenant l'exemple suivant va tirer tous les liens chauds dans 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>'

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

Créé 11/05/2009 à 21:08
source utilisateur

voix
1

Avec Perl, vous pouvez entourer les données que vous voulez avec l 'et tirer () ça plus tard, peut-être d'autres langues ont une fonction 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
}
Créé 04/08/2008 à 15:00
source utilisateur

voix
0

La lecture du texte entre crochets [] à savoir [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;
}
Créé 12/09/2014 à 09:26
source utilisateur

voix
0

Reportez - vous à cette question de se retirer du texte entre les balises avec des espaces et des points ( .)

[\S\s] est celui je

Regex pour correspondre à tout caractère, y compris de nouvelles lignes

Créé 28/08/2013 à 22:12
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more