【问题标题】:Regex to check with starts with [ and end with ]正则表达式检查以 [ 开头并以 ] 结尾
【发布时间】:2015-09-10 18:51:33
【问题描述】:

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

[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("^\\[.*.\\]$")

【问题讨论】:

  • 您的问题令人困惑。 matches 只返回真或假,不返回文本。此外,如果lines 代表从多行构建的文本,那么点. 将无法接受它们,因为它无法匹配\n\r
  • 这样的事情怎么样:[([^]]*)]。 regex101.com/r/vA9wV2/1

标签: java regex string-matching


【解决方案1】:

您没有显示完整代码,但代码 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));

输出是一样的。

【讨论】:

    【解决方案2】:

    您不需要正则表达式,因为您只需执行line.startsWith("[") && line.endsWith("]");,它会更快。

    【讨论】:

    • 我想你的意思是line.endsWith("]);
    【解决方案3】:

    .* 是贪婪的,这意味着您的正则表达式将尝试匹配它找到的第一个 [] 之间的最大可能范围。您可以尝试通过添加? 来使.* 不情愿,例如.*?。您也可以将. 替换为[^\\]],以避免在内部匹配]

    另外matches 检查整​​个字符串是否匹配正则表达式,它不返回匹配。我怀疑你可能想使用

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-07
      • 1970-01-01
      • 2011-09-10
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多