Java 尝试使用正则表达式将字符串拆分为3个部分

Java 尝试使用正则表达式将字符串拆分为3个部分,java,regex,Java,Regex,如果JSONPath有分隔符,我需要将它分成3部分。分隔符是数组的指示符 例如: $.Colors[*].name 需要成为: Before: "$.Colors" Separator: "[*]" After: ".name" 如果存在多个: 比如: 首先需要采取以下措施: Before: "$.Colors" Separator: "[*]" After: ".Color[*].name" 我还希望它能在过滤器上工作: $.Colors[?(@.type == 'Primary')].C

如果JSONPath有分隔符,我需要将它分成3部分。分隔符是数组的指示符

例如:

$.Colors[*].name

需要成为:

Before: "$.Colors"
Separator: "[*]"
After: ".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中的数据
  • (\[^[\]*\])
    -此部分捕获分隔符,该分隔符以文字
    [
    开头,后跟除
    [
    ]
    之外的任何字符,零或更多字符后跟结束符
    ]
  • (.*)
    -最后,这将捕获
    部分之后剩余的

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