2010-01-09 8 views
1

J'essaie d'écrire une chaîne regex pour correspondre à une chaîne rétablie à partir d'un canal IRC.Chaîne Regex pour IRC

Le message sera au format "paramètres COMMANDE"; la seule commande qui est construite par le système jusqu'à présent est la répétition.

Le regex J'utilise ressemble à ceci:

/![repeat] (.*?)/ 

Lorsque d'autres commandes sont ajoutées il ressemblera:

/![cmd1|cmd2|cmd3] (.*?)/ 

Il ne semble pas correspondre les bonnes choses dans la chaîne . Quelqu'un peut-il offrir une contribution à ce sujet?

Il semble que j'ai besoin d'ajouter des éléments de base regex.

() entre parenthèses renvoie des données, [] correspond mais ne renvoie pas.

L'échange vers() ne fonctionne pas non plus.

Le programme IRC que j'écris possède un nombre de commandes dynamique, jusqu'à présent j'ai seulement ajouté "repeat" pour que le motif de commande soit "[repeat]". Si j'ajoutais "say", ce serait "[repeat | say]".

Répondre

4

Utilisez les parenthèses pour le regroupement:

/!(cmd1|cmd2|cmd3) (.*)/ 

Les supports […] indiquent une classe de caractères décrivant un seul caractère d'un ensemble de caractères.

Vous ne devez pas non plus utiliser un .* non gourmand car la correspondance minimale de .*? est une chaîne vide.

1

Vous faites une erreur. Si vous remplacez vos parenthèses [] par () tout devrait fonctionner. Entre [] vous mettez quelques lettres pour correspondre. [abc] correspondrait à a, b, ou c, pas "abc", alors que (abc) correspondrait à "abc" et (abc|bca) correspondrait à "abc" ou "bca". Pour plus d'informations, consultez les expressions régulières Perl tutorial et reference pour plus d'informations.

1

Vous avez utilisé les mauvais supports

/!(cmd1|cmd2|cmd3) (.*)/ 

Je ne comprends pas ce que vouliez-vous dire avec ? dans votre regex

+0

Le '?' Rend la correspondance non gourmande. – adamse

+0

Vraiment merci pour votre explication. Je ne le savais pas. – Gaim

1

[repeat] est une classe de caractères et correspondra à r ou e ou p ... etc, Vous devez simplement utiliser

/!repeat (.*?)/ 

et

/!(cmd1|cmd2|cmd3) (.*?)/ 

Je ne comprends pas exactement ce que vous espérez faire correspondre, mais l'opérateur paresseux semble mal par exemple

/!COMMAND (.*?)/ appliquée à !COMMAND paramater sera match !COMMAND seulement, (.*?) à la fin d'une regex est garanti pour ne rien correspondre.