Java正则表达式-如何以字符串形式获取cbrackets中的所有事件?

Java正则表达式-如何以字符串形式获取cbrackets中的所有事件?,java,regex,Java,Regex,我试图从字符串中获取所有事件(cbrackets中的文本和cbrackets) 我试着这样做: String DATA = "ctrl_interface=/data/misc/wifi/sockets\n" + "driver_param=use_p2p_group_interface=1\n" + "update_config=1\n" + "dev

我试图从字符串中获取所有事件(cbrackets中的文本和cbrackets)

我试着这样做:

            String DATA = "ctrl_interface=/data/misc/wifi/sockets\n" +
                    "driver_param=use_p2p_group_interface=1\n" +
                    "update_config=1\n" +
                    "device_name=P580_ROW\n" +
                    "manufacturer=LENOVO\n" +
                    "model_name=Lenovo \n" +
                    "model_number=Lenov\n" +
                    "serial_number=hjhjh7\n" +
                    "device_type=10-0050F204-5\n" +
                    "os_version=01020300\n" +
                    "config_methods=physical_display virtual_push_button\n" +
                    "p2p_no_group_iface=1\n" +
                    "\n" +
                    "network={\n" +
                    "    ssid=\"test1\"\n" +
                    "    psk=\"154695\"\n" +
                    "    key_mgmt=WPA-PSK\n" +
                    "    sim_slot=\"-1\"\n" +
                    "    imsi=\"none\"\n" +
                    "    priority=1\n" +
                    "}\n" +
                    "\n" +
                    "network={\n" +
                    "    ssid=\"test1\"\n" +
                    "    psk=\"154695\"\n" +
                    "    key_mgmt=WPA-PSK\n" +
                    "    sim_slot=\"-1\"\n" +
                    "    imsi=\"none\"\n" +
                    "    priority=1\n" +
                    "}\n" +
                    "\n" +
                    "network={\n" +
                    "    ssid=\"test1\"\n" +
                    "    psk=\"154695\"\n" +
                    "    key_mgmt=WPA-PSK\n" +
                    "    sim_slot=\"-1\"\n" +
                    "    imsi=\"none\"\n" +
                    "    priority=1\n" +
                    "}\n" +
                    "\n" +
                    "network={\n" +
                    "    ssid=\"test1\"\n" +
                    "    psk=\"154695\"\n" +
                    "    key_mgmt=WPA-PSK\n" +
                    "    sim_slot=\"-1\"\n" +
                    "    imsi=\"none\"\n" +
                    "    priority=1\n" +
                    "}\n" +
                    "\n" +
                    "network={\n" +
                    "    ssid=\"SSID2\"\n" +
                    "    psk=\"test123456\"\n" +
                    "    key_mgmt=WPA-PSK\n" +
                    "    sim_slot=\"-1\"\n" +
                    "    imsi=\"none\"\n" +
                    "    priority=19\n" +
                    "}";

            String re1=".*?";   // Non-greedy match on filler
            String re2="(\\{.*?\\})";   // Curly Braces 1
            List<String> allMatches = new ArrayList<String>();
            Pattern p = Pattern.compile(re1 + re2, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
            Matcher m = p.matcher(DATA);


            while (m.find()) {
                allMatches.add(m.group());
            }

            for(int i = 0; i < allMatches.size(); i++) {
                Logger.d(allMatches.get(i).toString());
            } 

非常感谢您提供的任何建议

如果您只需要获取花括号和里面的内容,您可以尝试以下方法:

//                           | escaped opening bracket
//                           |  | any character, 0+ times
//                           |  |   | closing bracket
//                           |  |   |   | dot will also match new lines
Pattern p = Pattern.compile("\\{.*?}", Pattern.DOTALL);
Matcher m = p.matcher(DATA);
while (m.find()) {
    System.out.println(m.group());
}
使用给定的输入,它将打印:

{
    ssid="test1"
    psk="154695"
    key_mgmt=WPA-PSK
    sim_slot="-1"
    imsi="none"
    priority=1
}
{
    ssid="SSID2"
    psk="test123456"
    key_mgmt=WPA-PSK
    sim_slot="-1"
    imsi="none"
    priority=19
}
注释

  • 我在这里所做的基本上就是删除
    模式的第一部分,它将匹配“不需要的”文本
    
  • 如果您有更复杂的输入,即使用嵌套级别的花括号或花括号中的花括号,那么这将失败(事实上,regex不是解决方案)
为什么你决定这样做
re1
re2
?我使用了以下服务:@Mena我想,它对我的情况是否有用?要获取捕获组1中的文本,请使用
allMatches.add(m.group(1))。您不必转义
}
@redrom,仔细想想,这看起来不像[正确格式化的]JSON,所以正如您所说的,解析器不会有帮助-抱歉。谢谢,它工作起来很有魅力。用于处理的文本很简单,cbrackets中没有内部cbrackets。值得注意的是,原始正则表达式也起作用,只是值在
组(1)
中。
{
    ssid="test1"
    psk="154695"
    key_mgmt=WPA-PSK
    sim_slot="-1"
    imsi="none"
    priority=1
}
{
    ssid="SSID2"
    psk="test123456"
    key_mgmt=WPA-PSK
    sim_slot="-1"
    imsi="none"
    priority=19
}