2009-09-19 6 views
2

Comment puis-je analyser la chaîne « 7c23a12f0cffa6cf2fac0baf8eacf4c1 » à partir d'un fichier .. Je suis en train de récupérer les données entre _id= et &Comment puis-je récupérer les données entre "_id =" et "&"?

exemple de fichier:

 
4593733f4ab534f0001ecbe20000b3e9/cgi-bin/rsspipes/dispatch?Alternative=10&Category=ECMINSTITUTE&Type=News&_action=run&_id=7c23a12f0cffa6cf2fac0baf8eacf4c1&_out=json&_render=json&_time=&dojo_preventCache=1253389550099Z1f8wengine.pipes.yahoo.com:8080rhttp://ecminstitute.appspot.com/gMozilla/5.0 (Macintosh; U; Intel Mac OS X 10_4_11; en) AppleWebKit/531.9 (KHTML, like Gecko) Version/4.0.3 Safari/531.910jdmm6t5aneif&b=4&d=zhJNm4hpYEL50eT2b_Zabr3mZKV2C34ShzuA1A--&s=qm&i=.a0EUfWk9n2pue72QqA3 

Répondre

3

Utilisez un regex comme celui-ci:

_id=([a-f0-9]+)& 

Les parenthèses définissent un groupe que vous pouvez extraire des résultats.

4
id=([^&]*)& 

Les données entre id = & et sera compensée par la première (et unique) groupe et ensuite être accessible via .group(1) ou similaire en fonction de la langue bibliothèque/d'expressions rationnelles.

Édition: Modifié + à * selon la suggestion de Johannes Rössel.

+0

font des '+' 'un *' pour éviter des résultats étranges quand id est vide sous un étrange conditions. – Joey

0

J'utilise

perl -ne 'm/[&?]_id=([^&]+)(&|$)/ && print $1;' [file] 

[file] est le nom du fichier contenant les données.

3

Ceci est un peu plus robuste que certaines des alternatives.

 
[&?]_id=([a-f0-9]+)(?:[&]|$) 
[&?] # makes sure it isn't part of another parameter 
_id= 
(
    [a-f0-9]+ # at least one hexadecimal digit 
) 
(?: 
    [&] # make sure there isn't some trailing data 
| 
    $ # might be at the end of the string 
) 
+2

bonne capture - la fin de chaîne casserait les expressions rationnelles de tout le monde. Je recommanderais quand même d'utiliser un utilitaire de paramétrage cgi, car il y a de fortes chances que votre langue en envoie une avec le fichier stdlib et qu'elle prenne en charge les cas limites. –

+0

+1. Vous venez de me convaincre que je dois pratiquer mes expressions rationnelles. Je n'aurais pas couvert tous vos cas si j'avais écrit une expression rationnelle similaire aujourd'hui. –

+0

Si vous en avez besoin pour retourner "empty mais true" pour les cas où '_id' n'est pas défini" '& _id = &' "remplacez [a-f0-9] +' avec [a-f0-9] * ' –

0

j'utiliser les éléments suivants (non gourmand) Perl regex:

/_id=(.*?)&/ 
+1

'/_id = ([^ &] +)/'serait plus rapide. –

+0

Pourriez-vous expliquer pourquoi c'est le cas? Est-ce à cause de l'appariement gourmand vs non-gourmand? –

+0

Oui exactement. Les –

Questions connexes