Pourquoi ce modèle ne compile-t-il pas ?
Pattern.compile("(?x)[ ]\\b");
Erreur
ERROR java.util.regex.PatternSyntaxException:
Illegal/unsupported escape sequence near index 8
(?x)[ ]\b
^
at java_util_regex_Pattern$compile.call (Unknown Source)
Alors que les équivalents suivants fonctionnent ?
Pattern.compile("(?x)\\ \\b");
Pattern.compile("[ ]\\b");
Pattern.compile(" \\b");
S'agit-il d'un bogue dans le compilateur regex de Java, ou ai-je manqué quelque chose ? J'aime utiliser [ ]
en regex verbeux au lieu de backslash-backslash-space car cela permet d'économiser du bruit visuel. Mais apparemment, ce n'est pas la même chose !
PS : ce problème ne concerne pas les antislashes. Il s'agit de l'échappement des espaces dans une regex verbeuse en utilisant une classe de caractères contenant un seul espace. [ ]
au lieu d'utiliser une barre oblique inversée.
D'une manière ou d'une autre, la combinaison de l'expression verbale de la géométrie (?x)
et une classe de caractères contenant un seul espace [ ]
perturbe le compilateur et l'empêche de reconnaître l'échappement de la frontière du mot. \b
Testé avec Java jusqu'à la version 1.8.0_151
6 votes
Non pas que cela résoudrait la question, mais en quoi une classe de caractères, contenant juste un espace, est-elle différente d'un espace littéral ?
4 votes
@userunknown : Le
x
(activé par l'option(?x)
) fait que les espaces blancs et les commentaires sont ignorés ; ainsi(?x)a b
est équivalent àab
alors que(?x)a\ b
est équivalent àa b
. Comme l'explique Socowi dans sa réponse, le problème est que le PO s'attendait à ce que(?x)a[ ]b
pour être équivalent àa[ ]b
(c'est-à-dire àa b
), alors qu'en fait c'est équivalent àa[]b
(qui n'est pas valide).2 votes
@ruakh Exactement. Dans tous les autres moteurs PCRE
[ ]
est un moyen valide d'échapper aux espaces dans une regex verbeuse, voir par exemple Perl :echo 'a b' | perl -lne 'print if /a[ ]b/x'
ou libpcre :echo 'a b' | pcregrep '(?x)a[ ]b'