#java #regex
#java #регулярное выражение
Вопрос:
Мне нужно разделить путь JSONPath на 3 части, если в нем есть разделитель. Разделитель будет индикатором массива.
Например:
$.Colors[*].name
Нужно было бы стать:
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:
Регулярное выражение, которое вам нужно, это для получения ожидаемых совпадений, как указано в вашем сообщении,
(.*?)([[^[]]*])(.*)
Здесь,
(.*?)
— Эта часть захватываетBefore
часть как можно меньше перед шаблоном разделителя и захватывает данные в group1([[^[]]*])
— Эта часть захватывает разделитель, который начинается с литерала[
, за которым следует любой символ, отличный от[
и]
ноль или более, за которым следует закрытие]
(.*)
— Наконец, это фиксирует оставшуюся частьAfter
Демонстрация регулярных выражений
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