【问题标题】:Assign value to variable from ArrayList with regex使用正则表达式从 ArrayList 为变量赋值
【发布时间】:2020-02-25 15:14:21
【问题描述】:

我需要提取前 6 个字符 (ICAO) 并将其分配给来自 ArrayList(取自 https://opensky-network.org/apidoc/rest.html)的局部变量,如下所示:

["1234a5","ABC123","Schlumpfhausen",1572255699,1572255699,8.9886,48.3756,6278.88,false,155.16,216.64,-6.18,null,6484.62,"3026",false,0
"44035c","LDM87NM ","Austria",1572430045,1572430052,9.2009,48.6891,null,true,0,163,null,null,null,"6463",false,0
.
.
.
]

需要使用java.util.regex来解决这个问题。

String icao=null;

    Pattern icaoPattern = Pattern.compile("([+-]*[a-zA-Z0-9.]*)");
    Matcher matcher = icaoPattern.matcher(sentence.getAircraftJson());

        if(matcher.find()) {
             icao=matcher.group(1);
        }

结果应该是这样打印的:

ICAO: 1234a5 | Callsign: ABC123 | ...
ICAO: 44035c | Callsign: LDM87NM| ...

但我得到的只是

ICAO: | Callsign: | ...
ICAO: | Callsign: | ...

【问题讨论】:

  • 解析结构语言对于正则表达式来说并不是一个很好的用例。有 JSON 库(甚至 CSV 库 - 只需删除周围的 [ brackets ]),以确保避免您可能面临的许多不同类别的问题。

标签: java regex string arraylist


【解决方案1】:

您的模式将在开头或句子匹配空字符串“”。

前 6 个字符的要求也很棘手,只能使用正则表达式。

最简单的是:

Pattern icaoPattern = Pattern.compile("("
    + "[a-zA-Z0-9.]{6}"
    + "|[-+][a-zA-Z0-9.]{5}"
    + "|[-+]{2}[a-zA-Z0-9.]{4}"
    + "|[-+]{3}[a-zA-Z0-9.]{3}"
    + "|[-+]{4}[a-zA-Z0-9.]{2}"
    + "|[-+]{5}[a-zA-Z0-9.]"
    + "|[-+]{6}"
    + ")");

【讨论】:

    【解决方案2】:

    您可以尝试以下正则表达式来获取每个字符串,包括(或不)双引号 (") 或除逗号以外的任何字符:

     Pattern icaoPattern = Pattern.compile("(?:\"[^\"]*(?:\"\"[^\"]*)*\"|[^,])+");
     Matcher matcher = icaoPattern.matcher(result);
    
     while (matcher.find()) {
          System.out.println(matcher.group()); 
     }
    

    在您的代码中,您运行一次matcher.find()(在 if() 语句中)。您应该运行它,直到它找不到任何其他匹配项,即 while() 循环。

    您可以稍后使用 String 方法删除前导和尾随引号等。

    【讨论】:

      【解决方案3】:

      您希望group(0) 用于第一场比赛。正则表达式也需要一些注意,除非您可以非常确定内容始终是干净的。我删除了括号并将第一个 * 更改为 ? 并将另一个更改为 + 但这里可以做一百万件事以使其更安全

      Pattern icaoPattern = Pattern.compile("[+-]?[a-zA-Z0-9.]+");
          Matcher matcher = icaoPattern.matcher(sentence);
      
          while(matcher.find()) {
            System.out.println(matcher.group(0));
          }
      

      【讨论】:

      • group(0) 现在作为整个飞机出现 - 但我只想要 ICAO:matcher.group(0):3d0d6d DEDIJ Germany 1572439422 1572439439 9.7958 49.0613 944.88 false 52.29 346.92 -0.33 null 906.78 7000 false 0 0
      • matcher.find() 的上下文中,group(0) 将返回匹配项。尝试运行我粘贴的代码(它工作正常),然后将更改应用回您的真实代码
      猜你喜欢
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多