2010-09-15 15 views
1

Le manuel nous apprend à écrire des expressions régulières en utilisant le symbole epsilon (ε), mais comment puis-je traduire ce symbole directement en code sans avoir à retravailler complètement mon expression régulière?Comment puis-je représenter epsilon dans une expression régulière?

Par exemple, comment est-ce que j'écrirais cette regex qui attraperait toutes les chaînes de minuscules qui commencent ou se terminent par a (ou les deux).

pas à 100% sûr que ce soit correct, mais ...

((a | epsilon) [a-z] * a) | (Un [az] * (a | epsilon))

Ainsi, certaines chaînes qui doivent correspondre à inclure:

a //single "a" starts or ends with "a" 

aa //starts and ends with "a" 

ab //starts with "a" 

ba //ends with "a" 

aba //starts and ends with "a" 

aaaaaaaa //starts and ends with "a" 

abbbbbbb //starts with "a" 

bbbbbbba //ends with "a" 

abbbbbba //starts and ends with "a" 

asdfhgdu //starts with "a" 

onoineca //ends with "a" 

ahnrtyna //starts and ends with "a" 

Je seulement ce qu'il faut échanger epsilon pour le symbole correct, je ne veux pas modifier une partie du reste de l'expression. Aussi je veux être clair, je ne vérifie pas réellement le symbole epsilon, je veux avoir le choix d'un personnage ou de rien (eh bien pas rien ... epsilon).

Un tel symbole existe-t-il?

Est ce que je veux possible?

+3

Si le jeu de caractères (et la langue) le supporte, ne pourriez-vous pas simplement insérer 'ε' directement? Qu'avez-vous essayé? Qu'est-il arrivé? – jensgram

+0

@typoknig :) Posté réponse adhérant à la structure QA de SO. Ignorez s'il vous plaît. – jensgram

+0

@jensgram Je pense que je pourrais avoir été dans l'erreur. Je pensais que ça fonctionnait au début mais maintenant je ne suis pas sûr. Juste pour être clair, je ne vérifie pas le caractère réel «epsilon». Voir ma question révisée pour un meilleur exemple regex de ce que j'essaie de faire. – ubiquibacon

Répondre

4

omettez simplement le, car il désigne la chaîne vide:

([1-9]|)[0-9]* 

Il y a aussi un raccourci pour ce cas particulier:

([1-9]?)[0-9]* 

Le ? signifie zéro ou une occurrence du jeton précédent .

+0

merci, l'exemple que j'ai donné dans ma question à l'origine n'était pas bon, s'il vous plaît regardez ma question révisée. En outre, je suis au courant de '?', Mais je n'étais pas sûr si c'était aussi proche d'un epsilon que je pouvais obtenir ou non. – ubiquibacon

+0

@typoknig: Encore une fois, omettez le symbole! Votre nouvel exemple n'introduit rien qui invalide cette technique, et en fait cette technique ** fonctionnera toujours. En dehors de cela, votre expression peut être rendue beaucoup plus simple: 'a [a-z] * | [a-z] * a' –

+0

merci pour votre contribution, et je vois maintenant que la regex dans mon exemple aurait pu être plus simple. La raison pour laquelle je voulais utiliser 'epsilon' à la place d'un autre symbole est que' epsilon' est ce qui est utilisé dans mon livre, donc quand je discute de ces expressions avec d'autres en classe je veux être sur la même page ... en utilisant les mêmes méthodes et symboles. À cette fin, je voulais utiliser epsilon dans une regex codée afin que je puisse vérifier mon travail au fur et à mesure. – ubiquibacon