【问题标题】:Regular expression to parse specific set of data用于解析特定数据集的正则表达式
【发布时间】:2016-05-19 23:26:12
【问题描述】:

我正在使用java并解析具有可变数据长度的数据字符串,如下所示,

kv {
  key "prefix"
  str_value "prefix1"
}
kv {
  key "init"          
  int_value 1        
}
kv {
  key "init"          
  }

我们可以看到最后一个 kv 标记缺少一个值字段但仍然有效。想知道我应该使用什么正则表达式来检索 kv {} 标记之间的任何数据,如下所示。

key "prefix" str_value "prefix1"

key "init" int_value 1

键“初始化”

这是我用来获取 kv 分隔符的代码。

scan = new Scanner(new File(this.getFileName())).useDelimiter(".*kv\\s*\\{\\s*[^}].*+");
System.out.println(scan.next());

【问题讨论】:

  • 您可能不应该使用正则表达式来尝试解析多行,尤其是将该正则表达式用作“分隔符”。正则表达式功能强大,但并不总是适合这项工作的工具。您可能需要一个简单的基于令牌的解析器。
  • @JimGarrison 对于基于令牌的解析器,我应该逐行读取并检查每个字符串“startswith”还是任何其他有效的处理方式?

标签: java regex java.util.scanner


【解决方案1】:

类似这样的模式应该可以解决问题:

kv\s*\{\s*key\s+"([^"]*)"\s*(str_value\s+"([^"]*)"|int_value\s+(\d+))?\s*\}

Demo

您可以找到所有匹配项并读取每个匹配项的第一组、第三组和第四组的值,以检索键/值对。

但是,如果您只想捕获大括号之间的所有内容,无论它是什么,那么您可以做一些更简单的事情:

kv\s*\{([^}]*)}

然后从每场比赛中读取第一组的值。

【讨论】:

  • 嗨,史蒂夫,我很担心 kv{ } 标签内的任何事情。所以不特别关心 str_value 或 int_value
  • 如果你想捕获大括号之间的所有内容,那么只需在整个内容周围添加一个捕获组并读取它的值。
  • 这个解决方案非常接近我正在寻找的东西。 kv\s*\{([^}]*)},但如果我把它放在分隔符中,它会给我所有东西,除了我需要的东西。这意味着它将 kv{ } 视为分隔符并跳过包括与 kv\s*\{([^}]*)} 匹配的所有内容。我该怎么做呢?
  • 不要将其用作分隔符。遍历匹配列表并读取每个匹配中第一组的值。如果您必须使用正则表达式作为分隔符,您可以使用 (\}\s*)?key\s*\{
  • 糟糕。我的意思是 kv,不是 key
猜你喜欢
  • 1970-01-01
  • 2011-08-10
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2013-12-31
  • 2015-04-11
相关资源
最近更新 更多