Как я могу оценить ввод с регулярным выражением ECMA 262?
После некоторого чтения я узнал, что механизм javascript Java 8 nashorn
может помочь мне в этом.
Как я могу использовать скриптовый движок nashorn для соответствия регулярному выражению?Соответствие Javascript RegEx с использованием Nashorn
ответ
Предположим, у вас есть файл regex.js
, содержащий метод, используемый для определения, является ли данная строка соответствует заданному регулярному выражению:
var check = function(regex, str) {
return new RegExp(regex).test(str);
};
Вы можете оценить эту функцию с помощью сценария двигатель Насхорн и вызовите его следующим код:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval(new FileReader("regex.js"));
Invocable invocable = (Invocable) engine;
Object result = invocable.invokeFunction("check", "\\d+", "1");
System.out.println(result);
для того, чтобы вызвать функцию, вы должны сначала бросить двигатель сценарий к Invocable
. Этот интерфейс реализуется NashornScriptEngine и определяет метод invokeFunction
для вызова функции JavaScript для данного имени. Остальные аргументы метода затем передаются непосредственно в качестве аргументов методу JavaScript.
Обратите внимание, что это также возможно без внешнего файла JavaScript. Также можно избежать приведения к Invocable
, попросив механизм сценария оценить String. Это тот же самый код с этими двумя идеями:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval("function check(regex, str) { return new RegExp(regex).test(str); }");
Object result = engine.eval("check('\\\\d+', 1);");
System.out.println(result);
При прохождении переменных из Java в JavaScript, вы должны быть очень осторожны, о правильном экранирования символов: правила не одинаковы для обоих языков.
Второй вариант будет работать в моем случае. Завтра я постараюсь попробовать первое. –
Возможно, что-то вроде этого:
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine se = manager.getEngineByName("nashorn");
se.put("str", "the quick brown fox");
se.put("rgx", "/quick/");
Object result = se.eval("str.matches(rgx).length");
System.out.println(result);
Вы должны работать с Java8, чтобы получить «Насхорн» двигатель. Аргументом для se.eval(String)
является javascript. В этом примере я сохранил это просто. Вы можете делать много других вещей с точки зрения регулярного выражения. См. here.
Используя Java 8, вы можете использовать JavaScript-движок Nashorn с помощью пакета javax.script
с использованием идентификатора nashorn
.
Вот пример:
ScriptEngineManager engineManager = new ScriptEngineManager();
ScriptEngine nashorn = engineManager.getEngineByName("nashorn");
String ecmaScript = //YOUR SCRIPT HERE
//add any additional variables here
Object returnVal = nashorn.eval(ecmaScript);
ИСТОЧНИК: http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html
Вы хотите получить знакомые с ScriptEngine класса и вам нужно сделать совсем немного испытаний и проб & ошибка обрабатывать данные, которые возвращаются, поскольку возвращаемые данные не будут безопасными по типу. Отладчик будет вашим лучшим другом во время этого процесса.
Учитывая, что это практически то же самое, что и другие ответы, представленные здесь в одно и то же время ... для чего нужен downvote? – JNYRanger
- 1. Соответствие шаблону с использованием regex
- 2. Regex Javascript соответствие все
- 3. Javascript Regex частичное соответствие
- 4. Странное исключение с Java8 Nashorn regex engine
- 5. Получить первое соответствие строки с использованием regex
- 6. Соответствие и замена строки с использованием JavaScript regex
- 7. Изменить соответствие RegEx в JavaScript
- 8. Javascript Regex получить каждое соответствие
- 9. соответствие строк в javascript/regex
- 10. Соответствие повторяющейся группе с использованием regex
- 11. Соответствие шаблону n раз с использованием regex
- 12. Соответствие $ {variable} в тексте с использованием regex
- 13. Соответствие подстроки с использованием Regex в PowerShell
- 14. Nashorn - debug javascript run in Nashorn
- 15. Regex соответствие простого выражения
- 16. Соответствие этой строки без искажений - Javascript Regex
- 17. Javascript Regex соответствие несколько повторяющихся блоков
- 18. Соответствие невидимым символам в JavaScript RegEx
- 19. Соответствие ключевого слова Regex
- 20. Профиль Nashorn Выполнение Javascript?
- 21. Nashorn Javascript: NativeTypeError
- 22. Соответствие RegEx не работает
- 23. Regex соответствие с положительным lookhead
- 24. Regex соответствие с управляющими последовательностями
- 25. RegEx и соответствие с суффиксом
- 26. Regex Matching с использованием Javascript
- 27. JavaScript regex с использованием строк?
- 28. Как использовать соответствие шаблону Regex
- 29. Regex соответствие смайлики
- 30. Regex соответствие неправильного шаблона
Я немного смущен вашим вопросом. Вы спрашиваете, как использовать регулярные выражения ECMAScript с помощью движка Nashorn JS в Java 8? Есть ли причина, по которой вы не просто используете регулярные выражения Java? Где это делается (сервер/клиентская сторона)? – JNYRanger
@JNYRanger Для вашего первого вопроса - Да. Это то, о чем я прошу. Nashorn построен по спецификации ECMA, поэтому не должно быть никаких проблем с этим.
Поскольку Javascript RegEx отличается от Java RegEx. –
Я понимаю, что JavaScript регулярное выражение отличается синтаксически, но мой вопрос в том, почему вы хотите использовать JavaScript regex в отличие от Java regex, учитывая, что механизм RegEx на обоих языках предлагает тот же набор функций. Откуда вы получаете шаблон?Возможно, вам захочется вместо этого выполнить преобразование между синтаксисами regex Java и JavaScript, что было бы намного проще сделать: http://stackoverflow.com/a/8754472/2359643 – JNYRanger