Сохранение регулярных выражений в массив - PullRequest
0 голосов
/ 21 октября 2019

Я получаю строку url в качестве входных данных в конструктор класса Url, и я хотел бы проанализировать ее с моим регулярным выражением на такие части, как протокол, хост, порт, путь, запрос, фрагмент , где некоторые части могут бытьотсутствует. Например, я могу получить https://domain:80/path или https://domain/path?query#fragment И мне нужны такие массивы, как этот:

["https", "://", "domain", ":80", "path", "", "", "", ""]

или

["https", "://", "domain", "", "path", "?", "query", "#", "fragment"]

Каждая подстрока в массиве должна быть одной группой из регулярного выражения с использованием matcher.

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

1 Ответ

0 голосов
/ 21 октября 2019

Может быть,

\\b(https?)(://)(?:w{3}\\.)?([^\\s/:]+)(:\\d{2,6})?/([^?/\\s]+)(\\?)?(\\w+)?#?(\\w+)?\\b

может работать в некоторой степени нормально.

Тест

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


public class RegularExpression{

    public static void main(String[] args){

        final String regex = "\\b(https?)(://)(?:w{3}\\.)?([^\\s/:]+)(:\\d{2,6})?/([^?/\\s]+)(\\?)?(\\w+)?#?(\\w+)?\\b";
        final String string = "https://domain:80/path or I could get https://domain/path?query#fragment https://www.domain:80/path or I could get http://domain/path?query#fragment ";

        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));
            }
        }

    }
}

Вывод

Full match: https://domain:80/path
Group 1: https
Group 2: ://
Group 3: domain
Group 4: :80
Group 5: path
Group 6: null
Group 7: null
Group 8: null
Full match: https://domain/path?query#fragment
Group 1: https
Group 2: ://
Group 3: domain
Group 4: null
Group 5: path
Group 6: ?
Group 7: query
Group 8: fragment
Full match: https://www.domain:80/path
Group 1: https
Group 2: ://
Group 3: domain
Group 4: :80
Group 5: path
Group 6: null
Group 7: null
Group 8: null
Full match: http://domain/path?query#fragment
Group 1: http
Group 2: ://
Group 3: domain
Group 4: null
Group 5: path
Group 6: ?
Group 7: query
Group 8: fragment

Если вы хотите упростить / изменить / изучить выражение, это было объяснено на верхней правой панели regex101.com . При желании вы также можете посмотреть в эту ссылку , как она будет сопоставляться с некоторыми примерами входных данных.


RegEx Circuit

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

enter image description here

...