Преобразование регулярного выражения Javascript в синтаксис Java - PullRequest
17 голосов
/ 06 января 2012

Мне известно, что 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-символом.

Ответы [ 5 ]

36 голосов
/ 06 января 2012

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

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

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


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

Вот несколько ссылок, которые суммируют различия.

https://gist.github.com/CMCDragonkai/6c933f4a7d713ef712145c5eb94a1816
3 голосов
/ 23 октября 2017

Если вам действительно нужна семантика регулярных выражений 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);
3 голосов
/ 06 января 2012

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

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;
}
0 голосов
/ 22 октября 2018

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

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

0 голосов
/ 06 января 2012

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

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

...