Преобразование регулярного выражения 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-символом.
Ответы
Ответ 1
Измените начальный и конечный символы '/'
на '"'
, а затем замените каждый '\'
на "\\"
.
В отличие от Javascript, Perl и других языков сценариев, Java не имеет специального синтаксиса для регулярных выражений. Вместо этого они (как правило) выражаются с использованием строковых литералов Java. Но '\'
является escape-символом в строковом литерале Java, поэтому каждый '\'
в исходном регулярном выражении должен быть экранирован вторым '\'
. (И если в регулярном выражении есть буквальный символ обратной косой черты, вы получите "\\\\"
в строковом литерале Java !!)
Это немного сбивает с толку/устрашает новичков в Java... но это совершенно логично. Просто помните, что вы используете строковый литерал Java для выражения регулярного выражения.
Однако, как отмечает @antak, между языками регулярных выражений в Java и Javascript существуют различные различия. Поэтому, если вы возьмете произвольное регулярное выражение Javascript и транслитерируете его на Java, как описано выше, это может не сработать.
Вот некоторые ссылки, которые суммируют различия.
Ответ 2
Единственное, что вам нужно сделать, это дублировать обратные косые черты.
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;
}
Ответ 3
Если вам действительно нужна семантика регулярных выражений 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);
Ответ 4
Для конверсии можно использовать онлайн-оценщиков регулярных выражений, например https://regex101.com.
- Перейти к https://regex101.com
- Выберите
ECMAScript (JavaScript) FLAVOR
- Вставьте свое регулярное выражение
- Открыть
TOOLS -> Code Generator (LANGUAGE - Java)
- Копипаст
Несмотря на то, что это не хардкорный способ программиста, он значительно менее подвержен ошибкам.
Особенно, если вам нужно преобразовать только одно или два выражения.
Ответ 5
Регулярные выражения Java - это, прежде всего, строки, поэтому вы должны начинать с двойных кавычек, а не /
. Кроме того, в java вам нужно выйти из \
, выполнив два из них так: \\
.
Взгляните на этот учебник из Oracle для получения дополнительной информации.
Ответ 6
Если вы хотите использовать одно и то же регулярное выражение в Javascript, а также в Java, попробуйте получить строку регулярного выражения во время выполнения, а не пытаться определить регулярное выражение во время компиляции. Во время компиляции он проверит синтаксис и выдаст недопустимую ошибку escape-символа, однако во время выполнения он не проверит синтаксис и напрямую скомпилирует шаблон.
Если вы можете получить регулярное выражение из API или прочитать его из локально сохраненного текстового файла, это будет здорово.