2015-09-14 3 views
1

Как я могу оценить ввод с регулярным выражением ECMA 262?
После некоторого чтения я узнал, что механизм javascript Java 8 nashorn может помочь мне в этом.
Как я могу использовать скриптовый движок nashorn для соответствия регулярному выражению?Соответствие Javascript RegEx с использованием Nashorn

+0

Я немного смущен вашим вопросом. Вы спрашиваете, как использовать регулярные выражения ECMAScript с помощью движка Nashorn JS в Java 8? Есть ли причина, по которой вы не просто используете регулярные выражения Java? Где это делается (сервер/клиентская сторона)? – JNYRanger

+0

@JNYRanger Для вашего первого вопроса - Да. Это то, о чем я прошу. Nashorn построен по спецификации ECMA, поэтому не должно быть никаких проблем с этим.
Поскольку Javascript RegEx отличается от Java RegEx. –

+0

Я понимаю, что JavaScript регулярное выражение отличается синтаксически, но мой вопрос в том, почему вы хотите использовать JavaScript regex в отличие от Java regex, учитывая, что механизм RegEx на обоих языках предлагает тот же набор функций. Откуда вы получаете шаблон?Возможно, вам захочется вместо этого выполнить преобразование между синтаксисами regex Java и JavaScript, что было бы намного проще сделать: http://stackoverflow.com/a/8754472/2359643 – JNYRanger

ответ

4

Предположим, у вас есть файл 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, вы должны быть очень осторожны, о правильном экранирования символов: правила не одинаковы для обоих языков.

+0

Второй вариант будет работать в моем случае. Завтра я постараюсь попробовать первое. –

1

Возможно, что-то вроде этого:

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.

-1

Используя 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 класса и вам нужно сделать совсем немного испытаний и проб & ошибка обрабатывать данные, которые возвращаются, поскольку возвращаемые данные не будут безопасными по типу. Отладчик будет вашим лучшим другом во время этого процесса.

+0

Учитывая, что это практически то же самое, что и другие ответы, представленные здесь в одно и то же время ... для чего нужен downvote? – JNYRanger

Смежные вопросы