Комплексное преобразование регулярных выражений из PHP в Java - PullRequest
0 голосов
/ 12 февраля 2020

Я использовал шаблон в PHP, который работал правильно. Но в Java я пытался конвертировать безуспешно.

Это PHP регулярное выражение:

$pattern = "/^docker-pullable:\\/\\/docker-registry.default.svc:5000\\/(.*)\\/(.*)@(.*)$/";

То, что я пытался в Java:

String pattern = "^docker-pullable:\\\/\\\/docker-registry.default.svc:5000\\\/(.*)\\\/(.*)@(.*)$";

Строка:

String myString = "docker-pullable://docker-registry.default.svc:5000/project-d/mo@sha256:ed651abfd1f67130ace2b7b3a3h6hdjzpms230fee8f55b16677c4785fad88021";

Код:

Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(myString);
if(m.find()){
  String n1= m.group(1); // return project-d
  String n2= m.group(2); // return mo
  String n3= m.group(3); // return Sha
}

Я не нахожу ни одного конвертера из PHP в Java :( И не делать c это просто ..

Спасибо

1 Ответ

0 голосов
/ 12 февраля 2020

Вам не нужно экранировать / в регулярном выражении Java, поскольку у них нет разделителей, но если вы сделаете это, строка PHP (без разделителей) на самом деле верна. Таким образом, вы можете использовать это непосредственно, то есть

String pattern = "^docker-pullable:\\/\\/docker-registry.default.svc:5000\\/(.*)\\/(.*)@(.*)$";

или удалить экранирующее

String pattern = "^docker-pullable://docker-registry.default.svc:5000/(.*)/(.*)@(.*)$";

В любом случае вывод от печати n1 до n3 равен

project-d
mo
sha256:ed651abfd1f67130ace2b7b3a3h6hdjzpms230fee8f55b16677c4785fad88021

Обратите внимание, что, как указал @FedericoklezCulloca, вы должны действительно экранировать . s в docker-registry.default.svc в шаблоне, чтобы убедиться, что они соответствуют ., а не любому символу, например

String pattern = "^docker-pullable://docker-registry\\.default\\.svc:5000/(.*)/(.*)@(.*)$";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...