2011-09-14 4 views
1

J'utilise perl, java unix et beaucoup d'expression régulière de temps, mais je suis surpris en java à ce sujet:chaîne correspond à regexp

"help".matches("^h") 

est faux !!

De la documentation java: http://docs.oracle.com/javase/8/docs/api/java/lang/String.html#matches-java.lang.String-)

"vrai si, et seulement si, cette chaîne correspond à l'expression régulière"

 "help".matches("^h.*") 

ou

 "help".matches("^h.*$") 

retour bien sûr vrai .

Il est surprenant que moi?

+1

Quelle est la question? sommes-nous surpris? – amit

+0

Parce qu'il semble que l'expression est interprétée comme "^ expression $" 'ajoutant un' $ 'à la fin de celui-ci. Je m'attendais aussi à un match avec le premier exemple. – Matteo

+0

Java regex est bête. Vous avez complètement raison. La méthode correspond à IS broken. Jetez un oeil ici: http://mentaregex.soliveirajr.com – TraderJoeChicago

Répondre

1

"help" ne correspond pas à "^h". Seule la première lettre de help correspond à "^h"

+0

Mais dans ce cas, '^' devient inutile. Le début de la regex est toujours un '^': pourquoi l'avoir dans les spécifications alors? – Matteo

+0

Je ne suis pas sûr qu'un '^' soit toujours le début d'une regex. Par exemple, la partie 'el' dans' help' correspond à l'expression 'lp' –

+0

que voulez-vous dire par' el' correspond à l'expression 'lp'? J'ai fait quelques tests et semble vraiment que vous devez faire correspondre toute la chaîne. – Matteo

1

Java est un peu plus strict que perl ou ruby. Il essaie de faire correspondre la chaîne entière et "help" a un elp supplémentaire à la fin que/^ h/ne correspondra pas.

De l'docs:

Indique si cette chaîne correspond ou non l'expression régulière.

Pas une sous-chaîne, la chaîne entière.

+0

Mais dans ce cas pourquoi avoir '^' et '$' s'ils sont implicites dans une correspondance? – Matteo

+0

mode multiligne, http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html#MULTILINE est une situation. –

+0

Je vois, j'imaginais juste qu'il se comportait comme perl mais en fait non :-) Dans la documentation de 'MULTILINE' on peut lire _Par défaut, ces expressions ne correspondent qu'au début et à la fin de toute la séquence d'entrée. Le cas par défaut est mentionné mais n'a aucun sens ... – Matteo

Questions connexes