Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

test regexp

39 réponses
Avatar
unbewusst.sein
je veux savoir si userAgent comporte la chaine de caractère suivante :

AppleWebKit/527+

en particulier avec le "+" final et quelque soit le nombre, ici 527, et
qui pourrait être 525.18 (une version de build).

si j'écris le js suivant :

var isWebkitNightly=navigator.userAgent.match(RegExp(" AppleWebKit/[^
]+\+ "));

firefox me dit :
Erreur : invalid quantifier +
Fichier Source : http://127.0.0.1/Canvas/l_system_hair_ball.xhtml
Ligne : 69

si je supprime, juste pour essai, le \+, je n'ai pas cette erreur, j'en
déduis que le \+ a créé l'erreur.

je vais alors sur le site :
<http://www.regular-expressions.info/javascriptexample.html>

où j'entre :
Regexp: " AppleWebKit/[^ ]+\+ " // sans les ""
Subject string: "10_4_11; fr) AppleWebKit/525+ (KHT"

là, le même firefox 3RC1 ne me donne pas d'erreur, et pourtant le code
de cette page donne :

function demoMatchClick() {
var re = new RegExp(document.demoMatch.regex.value);
if (document.demoMatch.subject.value.match(re)) {
alert("Successful match");
} else {
alert("No match");
}
}

avec document.demoMatch.regex.value ce qui est entré en face de
"Regexp:"
et document.demoMatch.subject.value ce qui est entré en face de "Subject
string:"

il me semble que mon code est "équivalent" enfin, comme il ne marche pas
je me doute bien qu'il y a une différence, mais je ne vois pas laquelle.
--
Une Bévue

10 réponses

1 2 3 4
Avatar
unbewusst.sein
SAM wrote:

j'en sais rien ...
J'ai une syntaxe error avec :

javascript:var n=new RegExp(/ AppleWebKit/[^ ]++
/);alert(navigator.userAgent.match(n));


euh, normal, l'erreur-là :

en fait c'est équivalent à faire :

var re = / AppleWebKit/[^ ]++ /;
var n = new RegExp(re);

et donc ton re n'est pas bon déja à cause du second "/" (après
AppleWebKit)...

ou :

javascript:var n=new RegExp(/ AppleWebKit/[^ ]++
/);alert(navigator.userAgent.match(n));


idem

mais pas avec :

javascript:var n=new RegExp(/ AppleWebKit/[^ ]++
/);alert(navigator.userAgent.match(n));

comprenne qui pourra ...


ben là c'est correct, el second "/" est bien escapé et le second "+"
aussi, mais bon, à quoi ça sert de prendre une RegExp de RegExp ?

--
Une Bévue

Avatar
Olivier Miakinen
Olivier Miakinen <om+ wrote:


Probablement parce que, « + » n'étant pas un caractère spécial pour les
chaînes de caractères, « + » est équivalent à « + », et ta chaîne est
donc équivalente à " AppleWebKit/[^ ]++ ".



Coquille de ma part, due à la précipitation. Il fallait bien sûr lire
qu'elle est équivalente à " AppleWebKit/[^ ]++ ", mais tout le monde l'a
compris.

Essaye avec : " AppleWebKit/[^ ]++ "


ouais ça roule comme ça !

et comment tu expliquerais que la chaîne :

" AppleWebKit/[^ ]++ " entrée dans un input text sur le site cité +
haut ne donne pas d'erreur ? ET fonctionne très bien.


Tout simplement parce que le est alors lu pour lui-même, et pas
comme caractère d'échappement de la syntaxe JavaScript des chaînes de
caractères. D'ailleurs tu l'écrivais toi-même :
«
je vais alors sur le site :
<http://www.regular-expressions.info/javascriptexample.html>

où j'entre :
Regexp: " AppleWebKit/[^ ]++ " // sans les ""
»

Tu as bien écrit : « sans les "" ».

perso je suppute, comme ton conseil semble le confirmer, qu'il y a, à la
lecture de cet input par js un escaping fait derrière mon dos et que je
ne vois pas quand je fais un alert sur la valeur retournée par cet input
text ?


Ce n'est fait derrière ton dos que si tu ne connais pas la syntaxe des
chaînes de caractères en JavaScript. En dehors de ' " b f n r
t et v, toute séquence composée d'un et d'un autre caractère est
équivalente au caractère tout seul. Donc "+" est équivalent à "+".

m'enfin c'est sournois, en tout cas le site où l'on peux tester une
RegExp est à prendre avec des pincettes, compte-tenu de cette
expérience...


Mais non, au contraire ! Dans ta RegExp tu veux un suivi d'un +, et
sur le site tu saisis un suivi d'un +. C'est quand tu veux utiliser
la syntaxe des « String Literals » en JavaScript que tu es obligé
d'échapper le caractère en écrivant .


Avatar
Olivier Miakinen

ouais, bon, il y a des mystères ???

ce que je ne pige vraiment pas c'est mon essai sur le site
<http://www.regular-expressions.info/javascriptexample.html>

car si je fais un copier/coller de son code ça ne marche plus.

ce que j'intuite est qu'une chaîne de caractères entrée comme "ma
chaine" (directement dans le code js) n'est pas exactement la même chose
que "la même" chaîne entrée (sans les "") dans un input text


Il me semble, sauf ton respect, que tu intuites de travers... En tout
cas, il s'agit juste d'un problème de compréhension de la syntaxe des
chaînes de caractères littérales, et tout ceci n'a rien à voir avec les
RegExp.

Avatar
Olivier Miakinen

dans le second Safari n'est pas géné
dans le premier :

javascript:alert(navigator.userAgent.match(RegExp(' AppleWebKit/[^
]++ ')));

il me renvoie "AppleWebKit/419.3" au lieu de "null"


Tiens ? Essaye sur Safari (et ailleurs) :
1) javascript:alert("abbc abbb+c".match(RegExp('ab++c')));
2) javascript:alert("abbc abbb+c".match(RegExp('ab++c')));
3) javascript:alert("abbc abbb+c".match(RegExp('ab++c')));
4) javascript:alert("abbc abbb+c".match(RegExp('a(?:b+)+c')));

Normalement, les deux premiers devraient planter, le troisième devrait
rendre « abbb+c », et le dernier « abbc ». Si Safari retourne "abbc"
pour les deux premiers, c'est qu'il a une interprétation personnelle
des RegExp.

Avatar
Olivier Miakinen

isn't it ?


j'en sais rien ...
J'ai une syntaxe error avec :

javascript:var n=new RegExp(/ AppleWebKit/[^ ]++
/);alert(navigator.userAgent.match(n));


Normal. Entre //, ce n'est pas le qui doit être échappé, mais le /.

ou :

javascript:var n=new RegExp(/ AppleWebKit/[^ ]++
/);alert(navigator.userAgent.match(n));


Idem.

mais pas avec :

javascript:var n=new RegExp(/ AppleWebKit/[^ ]++
/);alert(navigator.userAgent.match(n));


Ben oui.

comprenne qui pourra ...


Moi j'ai compris... ;-)

morale de cette histoire :
=> toujours utiliser /mon expression/ comme le fait moz...



Pas d'accord. La morale de cette histoire, c'est plutôt qu'il faut
comprendre ce qu'on fait.

Ha! un dernier coup :

javascript:var n=new RegExp(/ AppleWebKit/[^ ]++
/);alert(n);alert(navigator.userAgent.match(n));

OK, me semble-ce.


Ben oui.

Reprenons sur un exemple plus simple. On veut faire un match sur
l'expression constituée de la lettre a, puis d'un slash, puis de la
lettre b, puis d'un plus, puis de la lettre c. C'est-à-dire la chaîne
qui, si on l'affichait, donnerait : a/b+c. Comme le caractère + est
spécial pour les RegExp, on veut que notre expression régulière soit
constituée des caractères a/b+c. Si on veut l'écrire avec la syntaxe
re = /.../ il faut échapper le /, tandis qu'avec Regexp("...") c'est le
qui doit être échappé.

Et donc :
re = /a/b+c/;
ou bien :
re = new RegExp("a/b+c");


Avatar
Olivier Miakinen

le truc d'Olivier me semble compromis là dans ce cas.


ben non, Olivier met un double escape devant le + dans une chaîne de
caractère


Tut tut tut ! Je mets un devant un + parce que c'est une expression
régulière, puis je mets un devant le parce que c'est dans une
chaîne littérale. Le résultat est le même, mais la démarche n'est pas
la même.

"+" le premier "" escape le second "" ce qui permet à la compil par
: new RegExp("...") de garder UN SEUL "" devant le second +.


Oui, là je suis d'accord.

en tout cas, perso, je n'utiliserais jamais new RegExp( /une
expression/)...


Je suis d'accord aussi.


Avatar
unbewusst.sein
Olivier Miakinen <om+ wrote:

Mais non, au contraire ! Dans ta RegExp tu veux un suivi d'un +, et
sur le site tu saisis un suivi d'un +. C'est quand tu veux utiliser
la syntaxe des « String Literals » en JavaScript que tu es obligé
d'échapper le caractère en écrivant .


oui, j'ai pigé ça, notamment, que je voyais le "comment ça se passe" à
l'envers...
--
Une Bévue

Avatar
Olivier Miakinen

Mais non, au contraire ! Dans ta RegExp tu veux un suivi d'un +, et
sur le site tu saisis un suivi d'un +. C'est quand tu veux utiliser
la syntaxe des « String Literals » en JavaScript que tu es obligé
d'échapper le caractère en écrivant .


oui, j'ai pigé ça, notamment, que je voyais le "comment ça se passe" à
l'envers...


Quant à moi, j'ai pigé plus tard que tu avais pigé... en fait tu étais
déjà visiblement au clair avec la syntaxe dans tes articles de 18 h 13,
mais j'ai répondu au fil de l'eau en découvrant toute l'enfilade cette
nuit.

La seule chose qui reste à éclaircir à mon avis est le comportement de
Safari (que je ne peux pas tester moi-même). J'attends impatiemment la
réponse de Stéphane à mon article de 0 h 17.


Avatar
unbewusst.sein
Olivier Miakinen <om+ wrote:

La seule chose qui reste à éclaircir à mon avis est le comportement de
Safari (que je ne peux pas tester moi-même). J'attends impatiemment la
réponse de Stéphane à mon article de 0 h 17.


ben écoutes, je peux tester sur Safari, mais AMHA, leur RegExp doit
fonctionner comme sur Gecko...

(d'après ce que j'ai compris Stéph' n'est pas dispo avant vendredi...)

je viens de passer quelque temps à lire des infos sur le futur de Safari
(Webkit) je trouve que l'équipe Webkit marche en très bonne entente avec
celle de Mozilla, c'est de bonne augure pour HTML 5.

reste que le JavaScript de Webkit n'est pas aussi avancé que celui de
Gecko, Webkit cherche d'abord à avoir un parser/interpreteur solide et
efficace (SquirrelFish).

par contre ils ont ajouté pas mal de nouvelles fonctionnalités à CSS
(par ex. les polices téléchargeables) et au DOM (gestion directe d'une
base de donnée).
--
Une Bévue

Avatar
Olivier Miakinen

La seule chose qui reste à éclaircir à mon avis est le comportement de
Safari (que je ne peux pas tester moi-même). J'attends impatiemment la
réponse de Stéphane à mon article de 0 h 17.


ben écoutes, je peux tester sur Safari, mais AMHA, leur RegExp doit
fonctionner comme sur Gecko...


Ce n'est apparemment pas le cas puisque, sauf erreur de copier-coller,
SAM disait qu'un RegExp construit à partir d'une chaîne contenant '++'
ne plante pas sur Safari (et retourne même une valeur non nulle).

Sur mon Gecko (SeaMonkey 1.1.9), les deux premières des expressions
suivantes mises dans l'URL provoquent une erreur JavaScript qui empêche
même la fenêtre alert() de s'ouvrir :

1) javascript:alert("abbc abbb+c".match(RegExp('ab++c')));
--------------------------------------------------------------------
Erreur : invalid quantifier +c
Fichier source : javascript:alert("abbc abbb+c".match(RegExp('ab++c')));
Ligne : 1

2) javascript:alert("abbc abbb+c".match(RegExp('ab++c')));
--------------------------------------------------------------------
Erreur : invalid quantifier +c
Fichier source : javascript:alert("abbc abbb+c".match(RegExp('ab++c')));
Ligne : 1

3) javascript:alert("abbc abbb+c".match(RegExp('ab++c')));
--------------------------------------------------------------------
abbb+c

4) javascript:alert("abbc abbb+c".match(RegExp('a(?:b+)+c')));
--------------------------------------------------------------------
abbc

5) javascript:alert("abbc abbb+c".match(RegExp('a(b+)+c')));
--------------------------------------------------------------------
abbc,bb

(d'après ce que j'ai compris Stéph' n'est pas dispo avant vendredi...)


Ce n'est pas grave, j'attendrai.


1 2 3 4