2015-03-23 1 views
2

Je suis en train d'analyser les sorties de commandes shell Unix dans un script JavaScript exécuté par le moteur de script Java. J'ai souvent besoin de diviser les chaînes par une quantité variable d'espaces et j'ai décidé d'utiliser une expression régulière pour cela.Nashorn et Rhino: fractionnement des chaînes par des espaces blancs regexp

Jusqu'à présent, dans Rhino (Java 7 et avant), je pourrais utiliser les éléments suivants pour diviser des chaînes par des espaces:

line.split("\\s+") 

Ce ne fonctionne plus dans Nashorn (Java 8 et versions ultérieures), la chaîne est simplement pas divisé du tout. Je dois utiliser les éléments suivants pour Nashorn:

line.split(new RegExp("\\s+")) 

maintenant - bien sûr vous pourriez dire - cela ne fonctionne pas dans Rhino. Cependant, j'ai besoin de maintenir la compatibilité avec Java 7 pendant au moins un an à venir, j'ai donc besoin d'une solution qui fonctionne avec les deux moteurs de script.

J'ai essayé une solution plutôt laide:

new java.lang.String(line).split("\\s+") 

Étonnamment sans chance dans Nashorn. Apparemment, il force en quelque sorte la création de son homologue NativeString pour les chaînes.

Y a-t-il une solution sympa pour diviser par une quantité variable d'espace, une qui fonctionne avec les deux moteurs de script? Ou devez-vous passer par la méthode "sale", c'est-à-dire déterminer le moteur de script à partir du script (si cela est même possible)?

+0

Il me semble que c'est Rhino qui fait la mauvaise chose. La spécification indique que l'argument peut être une chaîne ou une instance RegExp. La conversion implicite en RegExp est donc clairement erronée. – Pointy

+0

Considérant mes conclusions que j'ai posté comme un commentaire sur la réponse d'Attila, je crois que le problème avec Rhino est qu'il n'y a pas de conversion implicite de chaînes Java en chaînes JS. Dans l'exemple, je traitais en fait une chaîne Java. Le convertir en utilisant la fonction 'String' fonctionne, ie:' String (line) .split (new RegExp ("\\ s +")) '. Cependant, les littéraux regex sont moins verbeux. – pdinklag

Répondre

1

Que diriez-vous d'utiliser un littéral regex?

line.split(/\\s+/) 

Devrait fonctionner de manière identique dans chaque moteur JS.

+0

Merci, je ne savais pas ceux qui existaient! Apparemment, vous n'avez pas besoin d'échapper les barres obliques inverses, donc '/ \ s + /' le fait. Une note impotante: dans Nashorn (Java 8), vous pouvez le faire avec n'importe quelle chaîne ('java.lang.String'), car il semble y avoir une conversion implicite au type de chaîne natif du moteur. Lorsque vous utilisez Rhino (Java 7), vous devez vous assurer que vous avez affaire à une chaîne JS, cela ne fonctionne pas avec une chaîne Java. Donc la solution qui fonctionne dans les deux moteurs est: 'String (line) .split (/ \ s + /)'. – pdinklag