Получить текст в URL с динамической датой - Regex Java - PullRequest
1 голос
/ 11 июня 2019

Мне нужно получить текст между URL-адресом с датой на Java

Ввод 1:

/test1/raw/2019-06-11/testcustomer/usr/pqr/DATA/mn/export/

Вывод: testcustomer

Остается только /raw/, date изменится и testcustomer изменится

Вход 2:

/test3/raw/2018-09-01/newcustomer/usr/pqr/DATA/mn/export/

Вывод: newcustomer

String url = "/test3/raw/2018-09-01/newcustomer/usr/pqr/DATA/mn/export/";
String customer = getCustomer(url);
public String getCustomer (String _url){
    String source = "default";
    String regex = basePath + "/raw/\\d{4}-\\d{2}-\\d{2}/usr*";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(_url);
    if (m.find()) {
        source = m.group(1);
    } else {
        logger.error("Cant get customer with regex " + regex);
    }
    return source;
}

Возвращается 'default': (

Ответы [ 2 ]

2 голосов
/ 11 июня 2019

Здесь мы, вероятно, можем использовать raw, за которым следует дата в качестве левой границы, затем мы собираем желаемый результат в группу захвата, добавляем косую черту и используем остаток нашей строки с выражением, аналогичным до:

.+raw\/[0-9]{4}-[0-9]{2}-[0-9]{2}\/(.+?)\/.+

Демо

Test

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = ".+raw\\/[0-9]{4}-[0-9]{2}-[0-9]{2}\\/(.+?)\\/.+";
final String string = "/test1/raw/2019-06-11/testcustomer/usr/pqr/DATA/mn/export/\n"
     + "/test3/raw/2018-09-01/newcustomer/usr/pqr/DATA/mn/export/";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}

RegEx

Если это выражение нежелательно или вы хотите изменить его, посетите regex101.com .

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

2 голосов
/ 11 июня 2019

В вашем регулярном выражении /raw/\\d{4}-\\d{2}-\\d{2}/usr* отсутствует часть нужного значения, вам нужно регулярное выражение, которое находит дату и сохраняет следующее:

  1. /\w*/raw/[0-9-]+/(\w+)/.* или (?<=raw\/\d{4}-\d{2}-\d{2}\/)(\w+) будет хорошо

    Pattern p = Pattern.compile("/\\w*/raw/[0-9-]+/(\\w+)/.*");
    Matcher m = p.matcher(str);
    if (m.find()) {
        String value = m.group(1);
        System.out.println(value);
    }
    
  2. Или, если это всегда 4-я часть, используйте split()

    String value = str.split("/")[4];
    System.out.println(value);
    

А вот и >> code demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...