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