2009-08-25 5 views
2

Je suis dans le traitement de la conversion d'un programme de Perl en Java. Je suis venu à travers la ligneQue fait cette expression régulière?

my ($title) = ($info{$host} =~ /^\s*\(([^\)]+)\)\s*$/); 

Je ne suis pas très bon avec des expressions régulières, mais de ce que je peux le dire est correspondant à quelque chose dans la chaîne $ info {$ host} pour l'expression régulière^\ s * (([^)] +)) \ s * $ et en assignant la correspondance à $ title. Mon problème est que je n'ai aucune idée de ce que fait l'expression régulière et de ce qu'elle va correspondre. Toute aide serait appréciée.

Merci

+0

Essayez Expresso (http://www.ultrapico.com/), il fait un très bon travail de parsing RegExs et de montrer comment ils fonctionnent . –

Répondre

4

L'expression régulière correspond à une chaîne qui contient exactement une paire de parenthèses qui correspond (en fait, une ouverture et une fermeture de parenthèses correspondant, mais à l'intérieur un certain nombre de parenthèses peuvent se produire plus d'ouverture).

La chaîne peut commencer et se terminer par des espaces, mais pas d'autres. A l'intérieur des parenthèses, cependant, des caractères arbitraires peuvent apparaître (au moins un).

Les chaînes suivantes doivent correspondre:

(abc) 
(() 
    (ab) 

Par ailleurs, vous pouvez simplement utiliser l'expression régulière-est en Java (après avoir échappé à la barre oblique inverse), en utilisant la classe Pattern.

+0

Ok, So (une chaîne de caractères) est match mais (une chaîne de caractères) ne l'est pas. Merci. –

+0

Maintenant, je sais ce que j'ai trouvé, il est redondant. Avec toutes les possibilités d'entrée on peut faire de même avec trim() –

4

Il va correspondre à un groupe d'espaces de début, suivi d'un parent gauche, suivi d'un texte qui n'inclut pas un parent à droite, suivi d'un parent à droite, suivi de quelques espaces de plus.

Correspondances:

 (some stuff) 

ne réussit pas:

(some stuff 

    some stuff) 

    (some stuff) asadsad 
+1

...et tout ce qui est à l'intérieur de la parens (sans parens) est renvoyé à la variable $ title –

1

étape Ok par étape

/- citer le regex

^- le début de la chaîne

\ s * - zéro ou plus de tout caractère de type espace

(- un réel (caractère

(- commencer un groupe de capture

[^)] + les caractères^ou) le + indiquant au moins un

) -fin le groupe de capture

) et le caractère réel)

\ s * zéro ou plus d'espace comme des personnages

$ - la fin de la chaîne

/- fermer la citation regex

Pour autant que je peux travailler, nous recherchons des chaînes comme "(^)" ou "())" il me semble qu'il me manque quelque chose ici.

+2

[^)] signifie tout mais) – larelogio

+0

Merci - vous (ré) apprenez quelque chose de nouveau tous les jours. –

0
my ($title) = ($info{$host} =~ /^\s*\(([^\)]+)\)\s*$/); 

D'abord, m// dans le contexte de la liste renvoie les résultats capturés. my ($title) place le côté droit dans le contexte de la liste. En second lieu, $info{$host} est en correspondance avec le motif suivant:

/^ \s* \(([^\)]+) \) \s* $/x 

Oui, le drapeau utilisé x pour que je puisse insérer des espaces. ^\s* ignore tout espace blanc de premier plan. Ensuite, nous avons une parenthèse échappée (donc aucun groupe de capture n'est créé.) Nous avons un groupe de capture contenant [^\)] Cette classe de caractères peut être mieux écrite comme [^)] parce que la parenthèse droite n'est pas spéciale dans une classe de caractères et signifie quoi que ce soit à gauche parenthèse.

S'il y a un ou plusieurs caractères autres que une parenthèse fermante suivant la parenthèse ouvrante suivie d'une parenthèse fermante éventuellement entouré des deux côtés par des espaces, cette séquence de caractères est capturé et pour $x.