Nashorn и Rhino: разделение строк по регулярному выражению с пробелами

Я анализирую выходные данные команды оболочки Unix в JavaScript, выполняемом механизмом сценариев Java. Мне часто приходится разбивать строки на переменное количество пробелов, и я решил использовать для этого регулярное выражение.

До сих пор в Rhino (Java 7 и более ранние версии) я мог использовать следующее для разделения строк по пробелам:

line.split("\\s+")

Это больше не работает в Nashorn (Java 8 и более поздние версии), строка просто не разбивается. Я должен использовать следующее для Nashorn:

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

Вы можете сказать конечно, что это не работает в Rhino. Однако мне нужно поддерживать совместимость с Java 7 по крайней мере в течение года, поэтому мне нужно решение, которое работает с обоими механизмами сценариев.

Я попробовал это довольно уродливое обходное решение:

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

На удивление не повезло в Нашхорне. По-видимому, он каким-то образом заставляет создавать свой аналог NativeString для строк.

Есть ли хорошее решение для разделения на переменное количество пробелов, которое работает с обоими обработчиками сценариев? Или надо идти "грязным" путем - т.е. определять скриптовый движок изнутри скрипта (если это вообще возможно)?


person pdinklag    schedule 23.03.2015    source источник
comment
Мне кажется, что это Rhino делает что-то не так. Спецификация говорит, что аргумент может быть строкой или экземпляром RegExp. Таким образом, неявное преобразование в RegExp явно неверно.   -  person Pointy    schedule 23.03.2015
comment
Учитывая мои выводы, которые я опубликовал в качестве комментария к ответу Аттилы, я считаю, что проблема с Rhino заключается в отсутствии неявного преобразования строк Java в строки JS. В этом примере я фактически имел дело со строкой Java. Преобразование с помощью функции String работает, т.е.: String(line).split(new RegExp("\\s+")). Однако литералы регулярных выражений менее подробны.   -  person pdinklag    schedule 24.03.2015


Ответы (1)


Как насчет использования литерала регулярного выражения?

line.split(/\\s+/)

Должен работать одинаково в каждом движке JS.

person Attila Szegedi    schedule 23.03.2015
comment
Спасибо, не знал, что такие есть! По-видимому, вам не нужно экранировать обратную косую черту, поэтому /\s+/ делает это. Одно важное замечание: в Nashorn (Java 8) вы можете сделать это с любой строкой (java.lang.String), потому что, похоже, происходит неявное преобразование в собственный строковый тип движка. При использовании Rhino (Java 7) вы должны убедиться, что имеете дело со строкой JS, она не будет работать со строкой Java. Итак, решение, работающее в обоих движках: String(line).split(/\s+/). - person pdinklag; 24.03.2015