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

9 réponses

1 2 3 4
Avatar
unbewusst.sein
Olivier Miakinen <om+ wrote:


Ce n'est pas grave, j'attendrai.


résultats de la namip identique sur Safari 3.1.1 et Webkit latest, à
savoir :

1) et 2) rien ne s'affiche, pas de console d'erreur ;
3) à 5) résultats identiques aux tiens ...
--
Une Bévue

Avatar
Olivier Miakinen

résultats de la namip identique sur Safari 3.1.1 et Webkit latest, à
savoir :

1) et 2) rien ne s'affiche, pas de console d'erreur ;


Idem pour moi par défaut : c'est moi qui ai volontairement ouvert la
console d'erreur de SeaMonkey.

3) à 5) résultats identiques aux tiens ...


Et donc tu avais raison. Je suppose alors que Stéphane a dû faire une
erreur de copier-coller sur l'expression dont il disait qu'elle marchait
sur Safari.

Avatar
unbewusst.sein
Olivier Miakinen <om+ wrote:


Idem pour moi par défaut : c'est moi qui ai volontairement ouvert la
console d'erreur de SeaMonkey.


pas exactement la même chose avec Webkit qui affiche la "console" (en
fait Webkit a un DOM Inspector intégré avec css, database, js...) du
dernier document pour lequel j'ai ouvert l'inspecteur, et aucune
possibilité pour un script lancé par url.

safari réagit de la même manière, ils utilisent tout deux le même
Framework, avec un moteur différent.
--
Une Bévue

Avatar
SAM

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).


Je viens de re-vérifier :

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

dans mon Safari qui en est très content et me renvoie son Nom et N°
au lieu de faire "error" comme dans Fx

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 :


tests Safari 2 :

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


abbc

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


abbc

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


voili, voilou,

et ça aide bien pour essayer de capter les RegExp quand les navigateurs
les traitent à leurs sauces.
Avec tout ça je sais plus quel est le bon ! Ha! les 3 derniers.
Reste plus qu'à trouver mes fiches pour tenter de comprendre ce qu'ils font.










(Ha! Zutre ! je n'ai pas fait de fiches !)
--
sm

Avatar
unbewusst.sein
Olivier Miakinen <om+ wrote:


Et donc tu avais raison. Je suppose alors que Stéphane a dû faire une
erreur de copier-coller sur l'expression dont il disait qu'elle marchait
sur Safari.


En fait, d'après son dernier post, sous n'utilisons pas le même Safari
lui, c'est une version 2, et moi c'est la dernière 3.1.1...
--
Une Bévue

Avatar
Olivier Miakinen

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).


Je viens de re-vérifier :

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

dans mon Safari qui en est très content et me renvoie son Nom et N°
au lieu de faire "error" comme dans Fx


Ah ! D'après Bertrand (Labévue), c'est que ta version de Safari est plus
ancienne que la sienne.

tests Safari 2 :


Je les mets dans un autre ordre afin de les commenter.

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


abbb+c


Pas de surprise ici. La RegExp vaut /ab++c/, qui demande une lettre a
suivie d'un nombre quelconque (non nul) de lettres b, puis d'un +, avant
de finir par une lettre c.

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


abbc,bb


Cette RegExp est un peu stupide et inefficace, mais elle est correcte.
Entre le a et le c, je voudrais un nombre non nul de fois une séquence
d'un nombre non nul de b.

Elle est stupide car (b+)+ est équivalent à (b+), et inefficace car
l'interprète de RegExp risque de devoir étudier un grand nombre de cas
possibles avant de décider qu'il n'y a pas de réponse. Par exemple, dans
le cas "abbbbX", il étudiera :
a(bbbb) -> erreur
a(bbb)(b) -> erreur
a(bb)(bb) -> erreur
a(b)(bbb) -> erreur
a(bb)(b)(b) -> erreur
a(b)(bb)(b) -> erreur
a(b)(b)(bb) -> erreur
a(b)(b)(b)(b) -> erreur
et le nombre de cas augmente exponentiellement avec la longueur !

Noter que les parenthèses internes sont capturantes, ce pourquoi on a
comme résultat « abbc,bb » et non simplement « abbc ».

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


abbc


Ici, j'ai juste fait en sorte que les parenthèses ne soient pas
capturantes. Le « (?:b+)+ » est donc équivalent à ce que serait
« b++ » si cette syntaxe (stupide) était autorisée.

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


abbc


Ces deux syntaxes, comme on a vu, créent une RegExp égale à /ab++c/
puisque le '+' est transformé en '+' lors de la lecture de la chaîne
de caractères.

Visiblement, la version récente de Safari reconnaît qu'il est idiot
d'enchaîner deux quantificateurs '+' de suite, tandis que la version
plus ancienne ne se pose pas de questions.

Noter qu'on peut parfois rencontrer deux quantificateurs de suite,
mais avec une sémantique modifiée. Ainsi, '*?' signifie '*' en inversant
la gourmandise de la recherche, et '+?' signifie '+' avec le même
changement de gourmandise. Mais '++' n'est pas prévu.

----------------------------------------------------------------------

Et donc, pour en revenir à l'expression initiale, Safari 2
interprète ceci :
RegExp(' AppleWebKit/[^ ]++ ')
qui est équivalent à ceci :
RegExp(' AppleWebKit/[^ ]++ ')
comme s'il lisait cela :
RegExp(' AppleWebKit/[^ ]+ ')
(sauf qu'il consomme plus de ressources pour ça).


Avatar
SAM

Et donc, pour en revenir à l'expression initiale, Safari 2
interprète ceci :
RegExp(' AppleWebKit/[^ ]++ ')
qui est équivalent à ceci :
RegExp(' AppleWebKit/[^ ]++ ')
comme s'il lisait cela :
RegExp(' AppleWebKit/[^ ]+ ')
(sauf qu'il consomme plus de ressources pour ça).



Juste pour dire que j'ai lu.
Mais si j'ai une RegExp à faire un jour je crois que je te téléphone,
ça m'évitera la crise de nerf et ça ne te distraira pas bp, vu avec
quelle facilité tu manipules ;-)

--
sm

Avatar
Olivier Miakinen

[...] si j'ai une RegExp à faire un jour je crois que je te téléphone,
ça m'évitera la crise de nerf et ça ne te distraira pas bp, vu avec
quelle facilité tu manipules ;-)


:-D

Pas de problème, mon numéro est dans l'annuaire, et je suis le seul
Olivier Miakinen de France (pour ne pas dire plus).

Avatar
SAM

Pas de problème, mon numéro est dans l'annuaire,


Hop! dans le carnet d'adresses ;-)

Tien ? moi aussi je suis tout seul dans l'annuaire.

Comme ça on sera au moins 2 :-)

--
sm

1 2 3 4