Преобразование регулярного выражения Javascript в синтаксис Java

Я знаю, что regEx являются общими для всех языков...Но у меня возникли проблемы с написанием синтаксиса Java. У меня есть регулярное выражение, закодированное в JS как;

if((/[a-zA-Z]/).test(str) && (/[0-9]|[x21-x2F|x3A-x40|x5B-x60|x7B-x7E]/).test(str))         
return true;

Как написать то же самое на Java ?

я импортировал

import java.util.regex.Matcher;
import java.util.regex.Pattern;

просто добавить, из того, что я пытаюсь, это говорит, что x является недопустимым escape-символом..

4 ответов


изменить начальные и конечные '/' символы '"', а затем заменить каждый элемент '\' С "\".

в отличие от Javascript, Perl и других языков сценариев, Java не имеет специального синтаксиса для регулярных выражений. Вместо этого они (как правило) выражаются с помощью строковых литералов Java. Но!--2--> является escape-символом в строковом литерале Java, поэтому каждый '\' в исходном регулярном выражении должен быть экранирован со 2nd '\'. (И если у вас есть буквальная обратная косая черта характер в regex, вы в конечном итоге с "\\" в строковом литерале Java!!)

это немного запутанно / сложно для новичков Java ... но это абсолютно логично. Просто помните, что вы используете строковый литерал Java для выражения регулярного выражения.


однако, как отмечает @antak, существуют различные различия между языками регулярных выражений в Java и Javascript. Поэтому, если вы возьмете регулярное выражение Javascript и транслитерируете его на Java, как указано выше, это может не работа.

вот некоторые ссылки, которые описывали разницу.


единственное, что вам нужно сделать, это дублировать обратного слеша.

Pattern p1 = Pattern.compile("[a-zA-Z]");
Pattern p2 = Pattern.compile("[0-9]|[\x21-\x2F|\x3A-\x40|\x5B-\x60|\x7B-\x7E]");

if (p1.matcher(str).find() && p2.matcher(str).find()) {
    return true;
}

Если вам действительно нужна семантика регулярных выражений Javascript в Java, одним из подходов было бы использование встроенного движка Javascript для оценки регулярного выражения. Например:

javax.script.ScriptEngineManager se = new javax.script.ScriptEngineManager();
javax.script.ScriptEngine engine = se.getEngineByName("js");

String regExp = "/^\d+$/";
engine.put("str", "1234");
engine.eval("var rgx=" + regExp);
Object value = engine.eval(
    "function validate(r, s){ return (r).test(s);};validate(rgx, str);");
logger.log(value);

регулярные выражения Java-это прежде всего строки, поэтому вы должны начать с двойных кавычек, а не /. Кроме того, в java вам нужно избежать \ два из них вот так \.

посмотри этой учебник от Oracle для получения дополнительной информации.