Подтвердить что ты не робот

Преобразование регулярного выражения 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-символом.

4b9b3361

Ответ 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.

  1. Перейти к https://regex101.com
  2. Выберите ECMAScript (JavaScript) FLAVOR
  3. Вставьте свое регулярное выражение
  4. Открыть TOOLS -> Code Generator (LANGUAGE - Java)
  5. Копипаст

Несмотря на то, что это не хардкорный способ программиста, он значительно менее подвержен ошибкам. Особенно, если вам нужно преобразовать только одно или два выражения.

Ответ 5

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

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

Ответ 6

Если вы хотите использовать одно и то же регулярное выражение в Javascript, а также в Java, попробуйте получить строку регулярного выражения во время выполнения, а не пытаться определить регулярное выражение во время компиляции. Во время компиляции он проверит синтаксис и выдаст недопустимую ошибку escape-символа, однако во время выполнения он не проверит синтаксис и напрямую скомпилирует шаблон.

Если вы можете получить регулярное выражение из API или прочитать его из локально сохраненного текстового файла, это будет здорово.