Java 两种可能模式的复合正则表达式

Java 两种可能模式的复合正则表达式,java,regex,Java,Regex,我试图在java中进行一些正则表达式模式匹配,以便尝试从具有两种不同模式的结构文件中导入值 我有一个看起来像这样的文件: [Group Variable] name = Value [Valid Extensions] images = { jpeg png } 此文件是java程序的配置文件。我在这里使用的是java代码的修改版本: 这段代码允许我对变量名(如name)发出特定请求。(因此,不需要在等号左边保存任何内容 第一种模式很简单,“抓取等号后面的行中的任何内容”。用于该模式的正则表

我试图在java中进行一些正则表达式模式匹配,以便尝试从具有两种不同模式的结构文件中导入值

我有一个看起来像这样的文件:

[Group Variable]
name = Value

[Valid Extensions]
images = {
jpeg
png
}
此文件是java程序的配置文件。我在这里使用的是java代码的修改版本:

这段代码允许我对变量名(如name)发出特定请求。(因此,不需要在等号左边保存任何内容

第一种模式很简单,“抓取等号后面的行中的任何内容”。用于该模式的正则表达式非常简单:
(\s*([^=]*)=(*))=(*)

第二种是更复杂的“在大括号之间的等号后面抓取所有内容(即,将数组中的元素分散在多行中包围起来)”

我尝试使用
(?)的修改来查找两个大括号之间的文本?

这将从结构中提取jpeg和png。

根据您的描述,您可能正在查找类似的内容

Pattern p = Pattern.compile("=\\s*(\\{[^}]*\\}|.*)");
Matcher m = p.matcher(data);
while(m.find()){
    System.out.println(m.group(1));
    System.out.println("------");
}

解释

我们正在寻找在
=
之后存在的部分和可选的空白。但是我们不需要该部分,所以我们也可以


  • 使用look behind
    (?由于并非所有行都包含大括号,我建议使用两个步骤拆分
    字符串
    (这样,如果找不到与大括号匹配的字符串,您仍然可以继续处理原始的
    字符串

    步骤1是使用正则表达式提取
    字符串
    ,一旦我们得到
    字符串
    ,我们可以使用以下方法提取大括号之间的内容:

    String string = "fdwfs{aaaa}fsfds";
    Pattern pattern = Pattern.compile("\\{(.*?)\\}");
    Matcher matcher = pattern.matcher(string);
    while (matcher.find()) {
        System.out.println(matcher.group(1));
    }
    

    如果没有找到匹配项,它将不会进入
    ,而
    中。在这种情况下,我们可以处理整个
    字符串

    您对第二个正则表达式有疑问吗?请尝试使用
    Matcher#find()
    。您在这里希望得到什么样的结果呢?
    name
    images
    应该也是您结果的一部分吗?或者您只对
    Value
    {…}感兴趣
    part?谢谢,我更新了我的问题,试图让它更清晰。您的演示内容非常丰富,但我尚未成功地集成到我的代码中。它运行良好,但与其他字段键相比,项目提取还不太有效。我正在调查原因,因为如果我理解
    (?哦,我忘了更新链接演示中的代码。当我编写说明时,我认为有
    (?@EngBIRD“但与其他字段键相比,项目提取还不太有效”你能给出一些示例吗?正如你从演示中看到的,它应该可以很好地用于你在问题中提供的文本。我理解
    (?谢谢,我还在java端工作,(愚蠢的我,使用了一个缓冲行读取器,它当然限制了我尝试模式匹配的字符串…)。感谢您帮助我填写我对正则表达式的理解,我认为它不会返回双方,因为我在问题中链接的在线正则表达式引擎没有返回两种情况的结果,但现在我对它进行了更彻底的测试,它只返回了第一次测试的结果,所以我现在很乐观。我不确定您现在面临哪些问题,但此演示可能会对您有所帮助(假设您还希望包括财产名称)
    
    Pattern p = Pattern.compile("=\\s*(\\{[^}]*\\}|.*)");
    Matcher m = p.matcher(data);
    while(m.find()){
        System.out.println(m.group(1));
        System.out.println("------");
    }
    
    String string = "fdwfs{aaaa}fsfds";
    Pattern pattern = Pattern.compile("\\{(.*?)\\}");
    Matcher matcher = pattern.matcher(string);
    while (matcher.find()) {
        System.out.println(matcher.group(1));
    }