要检查的正则表达式以 [ 开始并以 ] 结束

Regex to check with starts with [ and end with ]

我在这样的文件中有一些文本:

[ABM-100]
0x00,Hours    
0x01,Minutes  
0x06,T2       

[CO2SMO]
1   ,Instrument
2   ,Time               
3   ,AAI               

我想获取 [ 和 ] 之间的文本,例如 ABM-100 和 CO2SMO。 我尝试使用正则表达式匹配,但结果是

[ABM-100]
0x00,Hours    
0x01,Minutes  
0x06,T2       

[CO2SMO]

我尝试了以下方法

line.matches("^\[.*.\]$")

您不需要为此使用正则表达式,因为您只需 line.startsWith("[") && line.endsWith("]"); 即可,而且速度会快得多。

.* 是贪心的,这意味着您的正则表达式将尝试匹配它找到的第一个 [] 之间的最大可能范围。您可以尝试通过添加 ?.*?.* 不情愿。也可以把.换成[^\]],避免匹配里面的]

同时 matches 检查整个字符串是否匹配正则表达式,return 不匹配。我怀疑您可能想使用

Pattern p = Pattern.compile(yourRegex);
Matcher m = p.matcher(text);
while(m.find()){
    String match = m.group();
    //do what you want with match like:
    System.out.println(match);
}

您没有显示完整代码,但代码 line.matches("^\[.*.\]$") 暗示您正在分别检查每一行。

如果要捕获匹配文本的一部分,则应使用捕获组。

由于您使用的是 matches(),因此不需要锚点 (^$),额外的 . 是多余的。

这显示了如何操作:

String[] lines = { "[ABM-100]",
                   "0x00,Hours    ",
                   "0x01,Minutes  ",
                   "0x06,T2       ",
                   "",
                   "[CO2SMO]",
                   "1   ,Instrument",
                   "2   ,Time               ",
                   "3   ,AAI  " };
Pattern p = Pattern.compile("\[(.*)\]");
for (String line : lines) {
    Matcher m = p.matcher(line);
    if (m.matches())
        System.out.println(m.group(1));
}

输出

ABM-100
CO2SMO

如果line不是一次代表一行,而是代表整个文本,则需要使用find(),并使^$锚点匹配开头和结尾通过指定 MULTILINE 标志行:

String text = "[ABM-100]\n" +
              "0x00,Hours    \n" +
              "0x01,Minutes  \n" +
              "0x06,T2       \n" +
              "\n" +
              "[CO2SMO]\n" +
              "1   ,Instrument\n" +
              "2   ,Time               \n" +
              "3   ,AAI  \n";
Pattern p = Pattern.compile("^\[(.*)\]$", Pattern.MULTILINE);
Matcher m = p.matcher(text);
while (m.find())
    System.out.println(m.group(1));

输出相同。