Попытка разбить строку на 3 части с помощью Regex - PullRequest
1 голос
/ 17 апреля 2019

Мне нужно разделить путь JSONPath на 3 части, если он имеет разделитель. Разделитель будет индикатором массива.

Например:

$. Цвет [*]. Имя

Нужно было бы стать:

Before: "$.Colors"
Separator: "[*]"
After: ".name"

В случае, если есть несколько:

как:

$.Colors[*].Color[*].name

Для этого нужно взять первое:

Before: "$.Colors"
Separator: "[*]"
After: ".Color[*].name"

Я также хочу, чтобы это работало на фильтрах:

$.Colors[?(@.type == 'Primary')].Color[*].name

Это разделит на это значение фильтра.

Before: "$.Colors"
Separator: "[?(@.type == 'Primary')]"
After: ".Color[*].name"

Мои попытки до сих пор были бесплодными:

static private String regexString = "\\[\\*]|\\[\\?\\(.*\\)]";
static private Pattern pattern = Pattern.compile(regexString);
private boolean splittable;
private String pre;
private String post;
private String split;

PathSplitter(String path) {
    Matcher matcher = pattern.matcher(path);
    if (!matcher.find()) {
        splittable = false;
    }
    else {
        splittable = true;
        split = matcher.group(0);
        //pre = matcher.group(1);
        //post = matcher.group(2);

    }
}

Любая помощь будет отличной!

1 Ответ

2 голосов
/ 17 апреля 2019

Требуется регулярное выражение для получения ожидаемых совпадений, как указано в вашем сообщении,

(.*?)(\[[^[\]]*\])(.*)

Здесь

  • (.*?) - эта часть захватывает часть Before как можно меньше перед шаблоном разделителя и собирает данные в группе 1
  • (\[[^[\]]*\]) - эта часть захватывает разделитель, который начинается с литерала [, за которым следует любой символ, отличный от [ и ] ноль или более, за которым следует закрывающий ]
  • (.*) - Наконец, это захватывает оставшуюся часть After часть

Regex Demo

Java-код,

List<String> list = Arrays.asList("$.Colors[*].name","$.Colors[*].Color[*].name","$.Colors[?(@.type == 'Primary')].Color[*].name");
Pattern p = Pattern.compile("(.*?)(\\[[^\\[\\]]*\\])(.*)");

list.forEach(x -> {
    Matcher m = p.matcher(x);
    if (m.matches()) {
        System.out.println("For string: " + x);
        System.out.println("Before: "+ m.group(1));
        System.out.println("Separator: "+ m.group(2));
        System.out.println("After: "+ m.group(3));
        System.out.println();
    }
});

Печатает следующее, как вы ожидали,

For string: $.Colors[*].name
Before: $.Colors
Separator: [*]
After: .name

For string: $.Colors[*].Color[*].name
Before: $.Colors
Separator: [*]
After: .Color[*].name

For string: $.Colors[?(@.type == 'Primary')].Color[*].name
Before: $.Colors
Separator: [?(@.type == 'Primary')]
After: .Color[*].name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...