Регулярное выражение для захвата взгляда с определенным словом или символом и заканчивается одним из слов

avatar
Nitin D
1 июля 2021 в 18:31
62
2
0

Хотите захватить строку после последней косой черты и перед словом (; sid=) или символом (?).

пример данных:

  1. sessionId=30a793b1-ed7e-464a-a630; Url=https://www.example.com/mybook/order/newbooking/itemSummary; sid=KJ4dgQGdhg7dDn1h0TLsqhsdfhsfhjhsdjfhjshdjfhjsfddscg139bjXZQdkbHpzf9l6wy1GdK5XZp; targetUrl=https://www.example.com/mybook/order/newbooking/page1?id=122;

  2. sessionId=sfdsdfsd-ba57-4e21-a39f-34; Url=https://www.example.com/mybook/order/newbooking/itemList?id=76734&para=jhjdfhj&type=new&ordertype=kjkf&memberid=273647632&iSearch=true; sid=Q4hWgR1GpQb8xWTLpQB2yyyzmYRgXgFlJLGTc0QJyZbW targetUrl=https://www.example.com/ mybook/order/newbooking/page1?id=123;

  3. sessionId=0e1acab1-45b8-sdf3454fds-afc1-sdf435sdfds; Url=https://www.example.com/mybook/order/newbooking/; sid=hkm2gRSL2t5ScKSJKSJn3vg2sfdsfdsfdsfdsfdfdsfdsfdsfvJZkDD3ng0kYTjhNQw8mFZMn; targetUrl=https://www.example.com/mybook/order/newbooking/page1?id=343;

Ожидается вывод ниже:

 1. itemSummary
 2. itemList
 3. ''(empty string)

Постройте приведенное ниже регулярное выражение, чтобы зафиксировать его, но оно будет точным на 100 %. Он захватывает какую-то дополнительную часть.

Регулярное выражение

Url=.*\/(.*)(; sid|\?)

Не могли бы вы помочь мне улучшить регулярное выражение, чтобы получить желаемый результат?

Заранее спасибо!

Источник

Ответы (2)

avatar
anubhava
1 июля 2021 в 18:37
0

Вы можете использовать это регулярное выражение в Java с жадным совпадением после Url=:

\bUrl=\S+/([^?;/]+)(?=; sid|\?)

Демонстрация регулярных выражений

Демонстрация регулярных выражений:

  • \b: Граница слова
  • Url=: Соответствие тексту Url=
  • \S+/: соответствует 1+ непробельным символам, за которыми следует /.
  • ([^?;/]+): соответствует 1+ символу, который не ? и ; и /
  • (?=; sid|\?): вперед, чтобы утверждать, что у нас впереди ; sid или ?
avatar
DigitShifter
3 июля 2021 в 10:20
0

Альтернативное решение:

Используемое регулярное выражение:

"^Url=.*/(\\w+|)$"

Регулярное выражение в тестовом стенде и контексте:

public static void main(String[] args) {
    String input1 = "sessionId=30a793b1-ed7e-464a-a630; "
            + "Url=https://www.example.com/mybook/order/newbooking/itemSummary; "
            + "sid=KJ4dgQGdhg7dDn1h0TLsqhsdfhsfhjhsdjfhjshdjfhjsfddscg139bjXZQdkbHpzf9l6wy1GdK5XZp; "
            + "targetUrl=https://www.example.com/mybook/order/newbooking/page1?id=122;";

    String input2 = "sessionId=sfdsdfsd-ba57-4e21-a39f-34; "
            + "Url=https://www.example.com/mybook/order/newbooking/itemList?id=76734&para=jhjdfhj&type=new&ordertype=kjkf&memberid=273647632&iSearch=true; "
            + "sid=Q4hWgR1GpQb8xWTLpQB2yyyzmYRgXgFlJLGTc0QJyZbW "
            + "targetUrl=https://www.example.com/mybook/order/newbooking/page1?id=123;";

    String input3 = "sessionId=0e1acab1-45b8-sdf3454fds-afc1-sdf435sdfds; "
            + "Url=https://www.example.com/mybook/order/newbooking/; "
            + "sid=hkm2gRSL2t5ScKSJKSJn3vg2sfdsfdsfdsfdsfdfdsfdsfdsfvJZkDD3ng0kYTjhNQw8mFZMn; "
            + "targetUrl=https://www.example.com/mybook/order/newbooking/page1?id=343;";

    List<String> inputList = Arrays.asList(input1, input2, input3);

    // Pre-compiled Patterns should not be in loops - that is why they are placed outside the loops
    Pattern replaceWithNewLinePattern = Pattern.compile(";?\\s|\\?");
    Pattern extractWordFromUrlPattern = Pattern.compile("^Url=.*/(\\w+|)$", Pattern.MULTILINE);

    int count = 0;
    for(String input : inputList) {
        String inputWithNewLines = replaceWithNewLinePattern.matcher(input).replaceAll("\n");
        // System.out.println(inputWithNewLines); // Check the change...
        Matcher matcher = extractWordFromUrlPattern.matcher(inputWithNewLines);
        while (matcher.find()) {
            System.out.printf( "%d. '%s'%n", ++count, matcher.group(1));
        }
    }
}

Вывод:

1. 'itemSummary'
2. 'itemList'
3. ''