Javascript ne sera pas divisé avec regex
-
03-07-2019 - |
Question
Depuis que j'ai commencé à écrire cette question, je pense avoir trouvé les réponses à chaque question que j'avais, mais je pensais poster de toute façon, car cela pourrait être utile à d'autres et des précisions plus utiles.
J'essayais d'utiliser une expression régulière avec lookahead avec la fonction javascript divisée. Pour une raison quelconque, il ne scindait pas la chaîne même s'il trouve une correspondance lorsque j'appelle correspondance Je pensais au départ que le problème venait de l’utilisation du look looking dans mon expression habituelle. Voici un exemple simplifié:
Ne fonctionne pas:
"aaaaBaaaa".split("(?=B).");
Fonctionne:
"aaaaBaaaa".match("(?=B).");
Il semble que le problème soit que, dans l'exemple de division, la chaîne transmise ne soit pas interprétée comme une expression régulière. L'utilisation de barres obliques au lieu de guillemets semble résoudre le problème.
"aaaaBaaaa".split(/(?=B)./);
J'ai confirmé ma théorie avec l'exemple stupide suivant:
"aaaaaaaa(?=B).aaaaaaa".split("(?=B).");
Quelqu'un d'autre pense-t-il qu'il est étrange que la fonction de correspondance suppose que vous avez une expression régulière, contrairement à la fonction de division?
La solution
String.split
accepte une chaîne ou une expression régulière en tant que premier paramètre. La méthode String.match
accepte uniquement une expression régulière.
J'imagine que String.match
va essayer de travailler avec tout ce qui est passé; donc, si vous passez une chaîne, il sera interprété comme une expression régulière. La méthode String.split
n'a pas le luxe de le faire, car elle peut accepter des expressions régulières ET des chaînes; dans ce cas, il serait stupide de deviner.
Modifier : (à partir de: "JavaScript: le guide définitif")
String.match
nécessite l'utilisation d'une expression régulière. L'argument passé doit être un objet RegExp
qui spécifie le modèle à rechercher. Si cet argument n'est pas un RegExp
, il est d'abord converti en un en le passant à RegExp ()
constructeur.
Autres conseils
Si je me souviens bien (et je pourrais très bien me tromper ici), la méthode de scission a été implémentée en javascript avant que le moteur de regex ne soit largement utilisé. Il s'agit donc sans doute d'une compatibilité ascendante.